0

我正在编写一个 bash 脚本以从远程网站下载文件。但是,远程网站需要首先提交一个 POST 表单,然后它返回一个文件。我设法找到了解决方案,并且效果很好。这里是:

curl -F 'data=filename.rar' --user-agent 'Mozilla/4.0 POST' http://somewebsite.com/index.html -v > filename

现在,问题是当服务器返回该文件时我必须重定向 STDOUT,否则我会在我的屏幕上得到乱码。我想要的是,而不是硬编码的“文件名”,来获取文件的真实名称并在那里重定向 STDOUT。使用 -sI 选项运行 curl 以获取标题然后解析文件名不是这里的解决方案,因为 curl 不接受 -I 和 -F 选项的混合。它必须是其中之一,但只有 -FI 可以查看标头,服务器也随它们一起发送文件。有没有办法只获取标头(请记住,我还必须发送帖子数据才能获取文件),以便我可以解析它们并提取文件名?然后我会发出新的 curl 请求,但现在将该文件名作为 STDOUT 值。或者也许有办法让 curl 自动从标题下载到文件名?

4

3 回答 3

0

您可能想尝试使用 curl 的 -o 选项。例如:

curl -F 'data=filename.rar' --user-agent 'Mozilla/4.0 POST' -o outputFileName http://somewebsite.com/index.html -v
于 2012-08-08T18:19:23.163 回答
0

在对我之前的回答发表评论之后,您可能想尝试 wget 。

FILENAME=`wget --post-file=filename.rar -P dir_to_save_files http://somewebsite.com/index.html | grep "filename" | cut -d"=" -f2 | awk '{print$1}'`; wget --post-file=filename.rar -O $FILENAME -P dir_to_save_files http://somewebsite.com/index.html 

您可能需要尝试一下,因为我没有测试方法。如果它实际上不是正在发布的文件,您也可以使用 --post-data=data。

  • 根据评论进行编辑。这可能不是最优雅的方式,但它应该是相对有效的。您可能需要使用 cut 语句和 grep 语句来使其以实际文件名为目标。
于 2012-08-08T20:09:10.793 回答
0

最后......解决方案是使用 --content-disposition 选项和 Wget 来保留原始文件名。

于 2012-08-08T22:47:51.713 回答