Ich versuche, eine Datei über die Befehlszeile in einen Google Cloud Storage-Bucket (GCS) zu verschieben. Zu einem späteren Zeitpunkt sollte dies in einem implementierten Skript auf der Benutzerseite ohne irgendeine Art von Benutzer-sichtbarer Authentifizierung verwendet werden.
Bisher generiere ich eine signierte URL wie folgt:
%Vor%was etwas wie
erzeugen wird Der nächste Schritt (am Benutzerende) wäre curl
, das die Datei mit einer PUT-Anfrage hochlädt. Wie so:
Ich kann das mit einer bestehenden Datei im Bucket und einer GET-Anfrage (zum Herunterladen) machen, aber es scheint nicht zum Hochladen zu funktionieren. curl
löst die Antwort des Servers mit folgenden Fehlermeldungen bei mir aus:
Und das macht für mich Sinn, da ich offensichtlich nicht nur eine PUT-Anfrage stelle, sondern eine für eine bestimmte Datei einer bestimmten Größe, während die von 'gsutil signurl' berechnete Signatur über diese Details nicht informiert wäre Zeit es berechnet wird.
Irgendwie hatte ich den Eindruck (z. B. basierend auf dem letzten Anwendungsfall, der in gsutil signurl
documentation beschrieben wird und auch in der Post So können Sie anonyme Uploads in die Cloud zulassen Speicher ), dass es möglich sein sollte, eine generische signierte URL zum Hochladen zu generieren und sie später zu verwenden. Täusche ich mich gerade über diesen Punkt oder gibt es eine Möglichkeit, die curl
-Anforderung zu beheben?
Irgendwelche Gedanken dazu werden geschätzt. Ich möchte jedoch, dass dies mit "minimalen Werkzeugen" funktioniert, d. H. Idealerweise nur Shell und Curl, aber keine anderen Programmiersprachen.
BEARBEITEN: Der erste Schritt zur Lösung besteht darin, die eigenen Gedanken zu organisieren, indem das genaue Problem formuliert wird. Das ist mir jetzt klar.
%Vor%löst tatsächlich das unmittelbare Problem. Dies bedeutet jedoch, dass mehrere Benutzer in dieselbe Datei schreiben würden, wenn sie dieselbe signierte URL verwenden. Die Dokumentation schlägt vor, dass Sie den Objektnamen bei der Erstellung der signierten URL weglassen können, d. H. Verwenden Sie
%Vor%Dies würde vermutlich jedem mit der resultierenden signierten URL erlauben, irgendein Objekt irgendeines Typs in meinen Bucket zu legen. Nur bekomme ich diese Arbeit nicht, da ich nicht sehe, wie GCS GCS dann mitteilen kann, an welches Objekt du eigentlich schreibst.
Wenn die Ressource kein einzelnes Objekt angibt, können Sie dies individuell tun, indem Sie der Anforderung einen URL-Parameter mit dem Namen des Objekts hinzufügen. Zum Beispiel:
curl -X PUT -T - [request-url]?name=[object-name] < testfile
Das funktioniert sicher mit storage/v1
, obwohl ich mich noch nicht mit einer signierten URL versucht habe.
Ich stieß auf das ähnliche Problem (403 verboten).
Es stellte sich heraus, dass meine json-Bibliothek, mit der ich jede Antwort marshale, &
durch \u0026
aus Sicherheitsgründen ersetzen würde. So kann die URL im Programm korrekt sein, aber in Clientseite ungültig
Ich vermute also, dass es in der Signature
Query-Zeichenkette Ihrer URL möglicherweise einen String-Coding-Bug gibt, da die Signatur-Zeichenkette im Vergleich zu meiner \u0026
schwerer zu erkennen ist.
Tags und Links curl google-app-engine