从CDN下载浏览器中的文件并设置下载的文件名

时间:2011-08-19 14:57:03

标签: php javascript download cdn twilio

我的通话记录存储在CDN(Rackspace CloudFiles)上,名称如下:

  

KPOWIEJFIE2034020SVN10ASKZALBMRI.mp3

(他们是Twilio呼叫SID)。

我的应用程序(CakePHP)显示这些录音的列表,并使用<audio>标签允许它们直接从CDN在页面上播放。我需要添加选项以直接下载文件,但我想下载名为更像这样的文件:

  

从Alex致电Firm,Inc,2011年8月19日下午4:00 .mp3

我知道如何使用PHP和readfile()将名称设置为我想要的名称,但这需要通过我的VPS流式传输文件数据。除了为带宽付费两次(一次通过CDN,一次通过我的VPS),这将使我的文件在CDN(速度和可用性)上失败。为了安全起见,我在CDN上只有调用SID命名的文件。

我能以某种方式在浏览器端执行此操作吗? JavaScript可以动态更改下载文件的名称吗?

我感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

文件名基于所请求的URL以及在获取URL时附加到响应的标头。除非您代理它,或者可以安排“友好”的URL指向资源,否则您无法控制浏览器下载文件的方式,因为请求将由机架空间服务器处理,而不是您的代码。

JS无法控制提取/下载过程,除了可能会破坏进入<audio>标记的网址。但是你只能使用任何重整版仍然允许URL与cloudfiles服务器相关。

答案 1 :(得分:1)

创建文件时,您应该能够set an object's Content-Disposition。例如,

PUT /<api version>/<account>/<container>/<object> HTTP/1.1
Host: storage.clouddrive.com
X-Auth-Token: 01234567-89ab-cdef-0123-456789abcdef
Content-Type: audio/mpeg
Content-Disposition: attachment; filename=Whatever_Filename_I_Want.mp3

该文件仍会以<object>名称的形式存储,但检索后会显示为Whatever_Filename_I_Want.mp3

修改:根据the documentation,您还可以使用此方法更新文件的元数据。

答案 2 :(得分:1)

根据我对文档的理解,您可以在CDN上为您的目的构建目录结构。因此,您可以将安全性放入目录名称,而不是依赖文件名的安全性。这样,http://cdn.example.com/KPOWIEJFIE2034020SVN10ASKZALBMRI.mp3变为http://cdn.example.com/KPOWIEJFIE2034020SVN10ASKZALBMRI/Call_from_Alex_to_Firm,_Inc,_8-19-2011_4:00pm.mp3,它将完全按照您的意愿下载,而不会牺牲安全性。