Ich versuche, ein Bild, das bereits in Google Cloud Storage gespeichert ist, zu drehen / spiegeln.
Dies ist der Blobkey:
%Vor%Dann erhalte ich das Bild und wende eine Bildtransformation an:
%Vor%Die RAW-Bilddaten, die ich in einem Byte-Array bekommen kann, benutze:
%Vor%Wenn ich GCS direkt verwende, kann ich es in den Cloud-Speicherdienst schreiben:
%Vor%Lokal kann ich das gedrehte Bild sehen, das innerhalb des appeengine-generierten Ordners sitzt, wie bekomme ich die neue bedienende URL oder was sollte der objectName sein, um das ursprüngliche Bild zu überschreiben? Ist der Objektname derselbe wie der ursprüngliche Dateiname beim Hochladen, ist es der Blobkey, ...?
Aktualisierung:
Ich speichere den GcsFilename beim Hochladen:
%Vor%Der GcsFileName sieht (lokal) so aus:
/ gs / Bucketname / fake-encoded_gs_key: YXVjdGlvbi1wb3J0YWwtdXBsb2Fkcy84SXp5VGpIUWLZSDY5X1Ytck5TbGtR-0f969f5b4f53a01479ff2d5eaf02fa1a (nicht indiziert)
Dann mache ich in meiner rotate-Methode folgendes:
%Vor%Wenn ich den neuen BlobKey mit bk.getKeyString () drucke, bekomme ich einen riesigen Blobkey:
encoded_gs_key: L2dzL2F1Y3Rpb24tcG9ydGFsLXVwbG9hZHMvZmFrZS1lbmNvZGVkX2dzX2tleTpZWFZqZEdsdmJpMXdiM0owWVd3dGRYQnNiMkZrY3k4NFNYcDVWR3BJVVdsWlNEWTVYMVl0Y2s1VGJHdFItMGY5NjlmNWI0ZjUzYTAxNDc5ZmYyZDVlYWYwMmZhMWE
Wenn ich es versuche:
%Vor%Ich erhalte jetzt einen INVALID_BLOB_KEY: Blob konnte nicht gelesen werden.
Gleiches gilt für:
%Vor%INVALID_BLOB_KEY: Blob konnte nicht gelesen werden.
Update - Live-Tests:
Ich habe mich live angemeldet, um zu sehen, ob ich herausfinden kann, wo die Dinge schief laufen.
Wenn ich den GcsFilename ausdrucke, bekomme ich Folgendes:
%Vor%Dann wird der neue Blobkey erzeugt:
%Vor%Verwenden Sie dann drei verschiedene Methoden zum Abrufen der neuen Serving-URLs:
%Vor%Wenn ich auf diese URLs zugreife, ist alles, was ich bekomme, das Originalbild.
Wenn ich im Cloud Storage Dashboard nachschaue, sitzt das Originalbild in: Startseite / Bucket-Name /
Das gedrehte Bild sitzt jedoch in: Startseite / Bucket-Name // gs / Bucket-Name /
Daher der Grund, warum das Original nicht überschrieben wird. Ich vermute, dass entweder der Dateiname, den ich erstelle, falsch ist oder der GcsOutputChannel, den ich erstelle, den Pfad ändert? Ich bin auch neugierig, warum ich die URL des ursprünglichen Bildes anstelle der URL des neuen Bildes bekomme?
Wenn ich den ursprünglichen GcsFileName teile und nur den letzten Teil nehme, erhalte ich einen Fehler:
%Vor%Google-Speicherdateinamen müssen das Präfix / gs /
habenIrgendwelche Ideen?
Lösung
Retreive BlobKey mit:
%Vor%... obwohl fileName.getObjectName () bereits "/ gs / bucket-name /" vor dem Objektnamen enthält. Wenn Sie es auf Standard out drucken, sollte Ihr Dateiname / gs / bucket-name / double, komisch, aber es funktioniert.
Mit diesem blobKey wird die korrekte Serving-URL erstellt
Um das ursprüngliche Bild zu überschreiben, müssen Sie lediglich denselben Cloud Storage-Dateinamen angeben.
Ich verstehe, dass Sie das Bild über App Engine über die BlobStore API in Cloud Storage hochgeladen haben. Um den tatsächlichen Dateinamen des ursprünglichen Bildes abzurufen, müssen Sie den folgenden Code im Upload-Servlet hinzufügen:
%Vor%Beachten Sie, dass Sie, wenn Sie die ursprüngliche Datei nicht überschreiben möchten, dem Kunden jedoch eine bedienende URL bereitstellen möchten, Folgendes tun können:
Verwenden Sie den ImageService wie folgt:
%Vor% Erstellen Sie eine benutzerdefinierte GCSServingServlet
, die die Methode BlobstoreService.serve()
zum Bereitstellen einer Datei aus dem Blobstore oder Cloud Storage verwendet. In diesem Fall müssen Sie die Berechtigungen selbst prüfen. Beachten Sie, dass Sie mit BlobKey
ein GCSFilename
aus einem BlobStoreService.createGSBlobKey()
erstellen können.
Verwenden Sie die Cloud Storage-Dienst-URLs:
Tags und Links java google-app-engine google-cloud-storage blobstore