带有下载文件名的Google App Engine getImageServingUrl

时间:2017-03-06 13:24:46

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

我正在使用getImageServingUrl方法生成图片的网址,并且与List of all the App Engine images service get_serving_url() URI options

中列出的选项一起使用效果很好

我可以添加“d”选项来强制下载文件,而不是仅仅在浏览器中显示它。问题是文件名默认为“unnamed。[ext]”(其中[ext]是源文件扩展名)。有没有办法可以将原始文件名传递给请求?

我可以使用CloudStorageTools :: serve以给定名称保存文件,但是例如我不能使用图像大小调整功能。

1 个答案:

答案 0 :(得分:0)

我不知道任何允许这样做的选项。 但我有另一种方式的概念,这有点复杂,但对你来说可能是个不错的选择。 您可以使用nginx构建反向代理,该代理将通过您自己的域为您提供Google图像。然后,您可以将原始请求中的文件名作为参数发送。在nginx中,您可以在代理请求之前从请求中删除filename参数,并将其添加为标头以在响应中定义文件名。 这在你的nginx配置中是一个非常直接的过程:

location /image-storage/ {
    expires 30d;

    #Get rid of headers to be overwritten
    proxy_hide_header Pragma;
    proxy_hide_header Cache-Control;
    proxy_hide_header Content-Disposition;

    #Add caching headers
    add_header Pragma public;
    add_header Cache-Control "public";
    #If the parameter "filename" is sent, use it as filename
    if ($arg_filename) {
        add_header Content-Disposition 'inline; filename="$arg_filename"';
    }
    #If the parameter "dl_filename" is sent, use it as filename and init download (attachment)
    if ($arg_dl_filename) {
        add_header Content-Disposition 'attachment; filename="$arg_dl_filename"';
    }

    #Proxy the request to google
    proxy_pass       https://lh3.googleusercontent.com/;
    proxy_set_header Host lh3.googleusercontent.com;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_buffering off;
}

这样,像https://yourdomain.com/image-storage/longgoogletokenhere?dl_filename=test.jpg这样的网址会被代理到https://lh3.googleusercontent.com/longgoogletokenhere?dl_filename=test.jpg,响应会获得缓存和文件名的新标头。