2011-08-19 79 views
0

我得有相似的名字存储在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可以即时更改下载文件的名称?

我感谢任何帮助!

+0

您必须以某种方式更改发送到用户浏览器的“Content-disposition:”标头。该标题可用于设置文件名和创建日期等内容。 我不知道如何以这种方式修改标题,但可以通过在服务器上缓存录制内容来节省一些带宽,以便您只收取一次双倍带宽的费用。 –

+0

https://forums.aws.amazon.com/thread.jspa?threadID=44958&tstart=0 - 这可能有帮助,我不确定你可以在Rackspace上做什么 –

回答

1

创建文件时应该可以使用set an object's Content-Disposition。例如,

PUT /<api version>/<account>/<container>/<object> HTTP/1.1 
Host: storage.clouddrive.com 
X-Auth-Token:-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,你也可以更新文件的元数据使用此方法。

+0

我会试试这个。谢谢! –

+0

这工作得很好。将文件添加到CloudFiles时设置Content-Disposition标头,并且它工作正常。必须对RackSpace的PHP API文件进行修改才能启用该功能。 –

+0

优秀!很高兴能帮上忙。不要忘记标记正确的答案,并用绿色的对号标记;) –

2

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

JS无法控制获取/下载过程,除了可能会损坏进入<audio>标记的url。但是然后你只能受到限制,仍然允许URL与云文件服务器相关。

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,它将按照您的意愿完全下载,而不会牺牲安全性。