我正在GCS上传图像,然后用不同的文件名(image.png)覆盖它。在GCS浏览器中,我可以看到图像被覆盖(不同大小,时间戳),但是当我尝试使用getServingUrl()获取图像的URL时,我得到了我第一次上传的图像的URL!
如果我添加一个带有新文件名(image2.png)的图像,那么我会得到一个新的URL。如果我用另一个图像覆盖这个图像(保持名称为image2.png),那么我再次获得原始image2.png的URL。
这是我的代码:
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));
有谁能告诉我这里缺少什么?如何让ImagesService给我新上传图像的句柄?感谢。
答案 0 :(得分:1)
这是预期的。该对象可以缓存在您无法控制的任何中间代理服务器中。因此,设置缓存控制标头也可能无法解决问题。
上传文件时,您可以使用文件的md5hash作为名称,而不是使用文件名保存文件。这将确保如果文件内容发生更改,您将拥有不同的md5hash。使用这种方法,您还可以使用缓存控制标头,这样可以加快网页的加载速度
答案 1 :(得分:0)
正如java_geek指出的那样,侯可能遇到了一个已知的App Engine错误:https://code.google.com/p/googleappengine/issues/detail?id=11381
如果您想要始终提供GCS对象的实时版本,并且您不需要App Engine图像服务的任何特殊属性,则可以使用" cacheControl"创建对象。属性设置为" no-cache",然后通过此URL链接到它们:
http(s)://storage.googleapis.com/bucket_name/object_name
这将直接从GCS提供图像。