谷歌云存储 - getServingUrl()给出旧图像的网址

时间:2016-06-07 05:28:53

标签: google-app-engine google-cloud-storage google-cloud-platform

我正在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给我新上传图像的句柄?感谢。

2 个答案:

答案 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提供图像。