0

我将通话录音存储在 CDN (Rackspace CloudFiles) 上,其名称如下:

KPOWIEJFIE2034020SVN10ASKZALBMRI.mp3

(它们是 Twilio 呼叫 SID)。

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

亚历克斯致电公司,2011 年 8 月 19 日下午 4:00.mp3

我知道如何使用 PHP 和 readfile() 将名称设置为我想要的任何名称,但这需要通过我的 VPS 流式传输文件数据。除了为带宽计费两次(一次通过 CDN,一次通过我的 VPS)之外,这会破坏将文件放在 CDN 上的目的(速度和可用性)。为了安全起见,我在 CDN 上仅使用呼叫 SID 命名了文件。

我可以在浏览器端以某种方式做到这一点吗?JavaScript 可以动态更改下载文件的名称吗?

我很感激任何帮助!

4

3 回答 3

2

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

JS 无法控制获取/下载过程,除了可能破坏进入<audio>标签的 url。但是您仅限于任何仍然允许 URL 与云文件服务器相关的修改。

于 2011-08-19T15:01:40.927 回答
1

您应该能够在创建文件时设置对象的 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.

编辑:根据文档,您还可以使用此方法更新文件的元数据。

于 2011-08-19T15:10:02.917 回答
1

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

于 2011-08-19T15:12:02.310 回答