0

Ich lade ein Bild auf das GCS und überschreibe es dann mit einem anderen mit demselben Dateinamen (image.png). Im GCS-Browser kann ich sehen, dass das Bild überschrieben wird (andere Größe, Zeitstempel), aber wenn ich versuche, die URL des Bildes mit getServingUrl() zu erhalten, bekomme ich die URL des Bildes, das ich das erste Mal hochgeladen habe !!!google cloud storage - getServingUrl() gibt URL des alten Bildes

Wenn ich ein Bild mit einem neuen Dateinamen (image2.png) füge, bekomme ich eine neue URL. Wenn ich dieses Bild mit einem anderen überschreibe (behalten Sie den Namen als image2.png bei), dann bekomme ich wieder die URL für original image2.png.

ist hier mein Code:

String bucketName = "my_bucket_name"; 
    String userFileName = "image.png"; 
    try { 
     GcsFileOptions instance = GcsFileOptions.getDefaultInstance(); 
     GcsFilename fileName = new GcsFilename(bucketName, userFileName);// getFileName(request); 
     GcsOutputChannel outputChannel; 
     gcsService.delete(fileName); 
     outputChannel = gcsService.createOrReplace(fileName, instance); 
     copy(request.getInputStream(), Channels.newOutputStream(outputChannel)); 
    } catch (IOException e) { 
     System.out.println(e.getMessage()); 
    } 

    ImagesService imagesService = ImagesServiceFactory.getImagesService(); 

    String url = imagesService.getServingUrl(ServingUrlOptions.Builder.withGoogleStorageFileName("/gs/" + 
      bucketName + "/" + userFileName).secureUrl(true)); 

Kann mir jemand bitte sagen, was ich hier fehlt? Wie bekomme ich den ImagesService, um mir den Zugriff auf das neu hochgeladene Bild zu geben? Vielen Dank.

+0

Verwenden Sie PHP anstelle von Java können Sie diesen Beitrag verweisen http://StackOverflow.com/Questions/37646849/How-can -we-use-firebase-image-file-and-resize-sie-using-get-serving-url/37673504 # 37673504 –

Antwort

0

Wie java_geek Sie darauf, hou begegnete wahrscheinlich einen bekannten Motor Bug App: https://code.google.com/p/googleappengine/issues/detail?id=11381

Wenn Sie wollen immer die Live-Version eines GCS-Objekt dienen, und Sie brauchen sie keine der besonderen Eigenschaften von App Engine Bild dient, Sie Objekte mit der „Cachecontrol“ Eigenschaft auf so etwas wie „no-cache“ erstellen und dann verknüpfen, um sie über diese URL:

http(s)://storage.googleapis.com/bucket_name/object_name 

Dadurch wird das Bild direkt von GCS dienen.

+0

Nein, das hat nicht geholfen. Ich gab cacheControl ("privat") wie Sie vorgeschlagen und getestet auch auf einem anderen Computer, so dass, wenn es ein Problem aufgrund des Browsers erstellt wird, wird es gelöst. Es gibt immer noch dieselbe URL. Ich teste gerade in Postman und da gibt es auch die gleiche URL. – Abhishek

+0

Interessant. Was ist, wenn Sie es direkt von GCS aus bedienen, indem Sie eine URL wie "https://storage.googleapis.com/bucket_name/object_name" bereitstellen? –

+0

Diese Lösung funktioniert nicht. Https://code.google.com/p/googleappengine/issues/detail? id = 11381 –

1

Dies wird erwartet. Das Objekt kann in einem der zwischengeschalteten Proxy-Server zwischengespeichert werden, auf die Sie keine Kontrolle haben. Das Setzen eines Cache Control-Headers löst das Problem möglicherweise nicht.

Wenn Sie die Datei hochladen, anstatt sie mit dem Dateinamen zu speichern, können Sie den md5hash der Datei als Namen verwenden. Dies würde sicherstellen, dass sich der Dateiinhalt ändert, wenn Sie einen anderen md5hash haben. Mit diesem Ansatz können Sie auch Cache-Control-Header verwenden und es würde das Laden Ihrer Webseite beschleunigen

+0

Ich nehme an, Sie haben recht, die Verwendung eines Hashwertes oder eines eindeutigen Namens scheint der richtige Weg zu sein. Vielen Dank. – Abhishek