从 URL 检索 zip,但使用 Content-Disposition 文件名标识符保存到本地文件

Posted

技术标签:

【中文标题】从 URL 检索 zip,但使用 Content-Disposition 文件名标识符保存到本地文件【英文标题】:Retrieve zip from URL, but save with Content-Disposition filename identifier to local file 【发布时间】:2014-11-04 20:32:26 【问题描述】:

我正在尝试从 URL 下载 zip,内容如下:

$filename = "path/to/File.zip";
file_put_contents($filename, file_get_contents('http://example.com/Download.zip');

我的问题是我想使用 Content-Disposition 标头中的文件名存储该文件,而不是占位符 latest-stable。当我预定义路径时,它会保留新名称。

如果您尝试在浏览器中下载以下内容:

http://downloads.wordpress.org/plugin/jetpack.latest-stable.zip

下载对话框将显示jetpack.3.1.1.zip,这是我想要的文件名,而不是jetpack.latest-stable.zip

【问题讨论】:

使用 $http_response_headerpreg_grep / preg_match 获取您的文件名。 噢噢噢!谢谢 ;D 类似 preg_match("/filename=(.*?.zip)/sim", $new_name, $match) 和 $new_name 是 http_response_header 的内爆! 感谢@mario 编辑帖子^.^ 【参考方案1】:

您已经有了文件名 (Download.zip),所以您可以:

$url = 'http://example.com/Download.zip';
$filename = basename($url);

如果您有更复杂的 URL,您可以使用 parse_url 来获取各种 URL 组件。

编辑

从您提供的 cmets 中,您提供了一个导致不同文件名的 URL。在这种情况下,您可以检查 $http_response_header 数组,该数组将在调用 file_get_contents 后填充标题:

$data = file_get_contents('http://downloads.wordpress.org/plugin/jetpack.latest-stable.zip');
print_r($http_response_header);
/* output:
Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Server: nginx
    [2] => Date: Thu, 11 Sep 2014 04:11:03 GMT
    [3] => Content-Type: application/zip
    [4] => Content-Length: 7303566
    [5] => Connection: close
    [6] => Cache-control: private
    [7] => Content-Disposition: attachment; filename=jetpack.3.1.1.zip
    [8] => Last-Modified: Wed, 10 Sep 2014 16:17:52 GMT
    [9] => X-Frame-Options: SAMEORIGIN
    [10] => X-nc: EXPIRED lax 202
    [11] => Accept-Ranges: bytes
)
*/

查找 Content-Disposition 标头并删除文件名(您可以为此使用正则表达式和/或 http_parse_headers)。

【讨论】:

在这种情况下,您在 WebView 中下载的文件名与 url 不同。 你能举个例子吗? downloads.wordpress.org/plugin/jetpack.latest-stable.zip 比如webbiedave

以上是关于从 URL 检索 zip,但使用 Content-Disposition 文件名标识符保存到本地文件的主要内容,如果未能解决你的问题,请参考以下文章

Python 无权访问此服务器/从 ZIP 返回城市/州

为啥我要检索的 URL 参数没有完全显示?

使用 AJAX Jquery 以 JSON 格式显示检索到的图像 URL

检索带有标签 <content:encoded> 的 RSS 提要

使用 Python 下载 zip 文件给出 HTTP 403

如何获取 iphone 中下载的 zip 文件名