如何使用带有cURL的响应头文件名保存文件

Joh*_*ohn 51 curl

此问题与cURL的命令行版本有关.

我正在尝试从cgi脚本下载文件.

HTTP://someserver/perl/dl.pl ID = 2

使用浏览器,文件名为'remotefilename.gz'cURL想要将文件保存为'dl.pl?ID=2'

如何让cURL保存到响应头中带有文件名的文件?

Dan*_*erg 82

如果你有一个足够新的卷曲(版本7.20.0或更高版本),- J / - remote-header-name就是你想要的.

您将-J与-O结合使用,这使得curl使用URL中的文件名部分作为命名输出文件的主要方式,然后如果响应中有Content-disposition:标头,curl将使用该名称代替.

  • `-OJ`是一个杀手选项,这很容易记住:) (22认同)
  • 请记住,您应该将-J/ - remote-header-name与-O/ - remote-name选项一起使用,否则它不起作用. (8认同)
  • 考虑到@jchook对另一个答案的评论,我觉得记住`-JLO`助记符看起来很漂亮很方便:) (5认同)
  • 如果您不想让curl 在服务器返回404 时创建文件,您也可以添加-f。...尽管它不像-OJ 或-JLO 那样容易记住。:) (3认同)
  • 当“内容处置:附件;”时不起作用 filename*=utf-8''filename`,在本例中,使用 `wget --content-disposition URL` (3认同)

egi*_*ray 17

curl http://example.com/dl.php?file=3123123 -O -J
Run Code Online (Sandbox Code Playgroud)

如果服务器使用重定向使用这些:

--location-trusted
--max-redirs 10
Run Code Online (Sandbox Code Playgroud)

  • 小心 `--location-trusted`,因为它会将 HTTP 身份验证信息转发到重定向,即使是跨不同的域。`--location` 似乎是一个更安全的选择。 (2认同)

jch*_*ook 15

我发现curl -OJ给了我分段错误:尝试一次下载多个URL时出现11错误.

我的解决方案是使用wget.最新版本支持HTTP Content-Disposition标头,通常包含文件名信息.

wget --content-disposition http://example.com/download/url
Run Code Online (Sandbox Code Playgroud)