【问题标题】:How to download multiple files with one HTTP request?如何通过一个 HTTP 请求下载多个文件?
【发布时间】:2010-11-05 16:57:52
【问题描述】:

用例:用户点击网页上的链接 - 砰!加载他文件夹中的文件。
我尝试使用multipart/mixed message 打包文件,但它似乎只适用于 Firefox

我的回复是这样的:

HTTP/1.0 200 OK
Connection: close
Date: Wed, 24 Jun 2009 23:41:40 GMT
Content-Type: multipart/mixed;boundary=AMZ90RFX875LKMFasdf09DDFF3
Client-Date: Wed, 24 Jun 2009 23:41:40 GMT
Client-Peer: 127.0.0.1:3000
Client-Response-Num: 1
MIME-Version: 1.0
Status: 200

--AMZ90RFX875LKMFasdf09DDFF3 
Content-type: image/jpeg 
Content-transfer-encoding: binary 
Content-disposition: attachment; filename="001.jpg" 

<< here goes binary data >>--AMZ90RFX875LKMFasdf09DDFF3 
Content-type: image/jpeg 
Content-transfer-encoding: binary 
Content-disposition: attachment; filename="002.jpg" 

<< here goes binary data >>--AMZ90RFX875LKMFasdf09DDFF3 
--AMZ90RFX875LKMFasdf09DDFF3--

谢谢

附:不,压缩文件不是一种选择

【问题讨论】:

  • 这是实际响应吗?或者你是否为每个附件剪掉了诸如 Content-length 之类的东西?如果这不起作用,我或多或少会假设当前一代的网络浏览器无法做到这一点。
  • 这样做的目的是什么?可能有更好的方法...
  • 实际上,现在我正在查看 rfcs,可能甚至不需要 content-length。
  • 我发现一篇文章似乎可以解决同样的问题。还没试过:http://www.motobit.com/tips/detpg_multiple-files-one-request/
  • @Martin,他说的是下载,而不是上传。您发布的链接是关于上传的。干杯。

标签: http browser multipart


【解决方案1】:

压缩是唯一可以在所有浏览器上获得一致结果的选项。如果它不是一个选项,因为您不知道可以动态生成 zip,那么它们可以。如果这不是一个选项,因为你对 zip 文件怀恨在心,好吧..

MIME/multipart 用于将电子邮件消息和/或 POST 传输到 HTTP 服务器。它从未打算在 HTTP 事务的客户端接收和解析。有些浏览器确实实现了它,有些则没有。

作为另一种选择,您可以使用 JavaScript 脚本打开窗口下载各个文件。或者一个 Java Applet(需要机器上的 Java 运行时,如果它是一个企业应用程序,这应该不是问题 [因为 NetAdmin 可以将它部署在工作站上]),它将文件下载到用户选择的目录中。

【讨论】:

  • 压缩不是一个选项,因为要求是不要求用户在下载后执行额外的操作。您声明多部分消息不适用于 HTTP 传输是没有意义的。例如,使用 multipart/form-data 上传多个文件。我看不出有什么理由应该禁止二进制下载多部分消息
  • @zakovyrya:让我重新表述一下最后一句话。从来没有打算在 HTTP 事务的客户端接收和解析多部分消息。
  • @Einstein:我误会了我原来的陈述,因为我认为人们知道 multipart/mixed 和 multipart/form-data 之间的区别。同样, multipart/* 从未打算在 HTTP 事务的客户端接收和解析。它在文件上传时在客户端创建,并在服务器端接收和解析。
  • 抱歉,您的评论是在我发送我的评论后才出现的。也许这不是 W3C/IETF 认可的事情,但我确实记得十多年前自己做过这件事。当时它是“服务器端推送”的一部分
  • 我同意,这样做的唯一方法是动态创建一个 zip 文件并发送给用户。
【解决方案2】:

请记住 >10 年前在 netscape 中的 4 天。它使用了与您所做的一样的边界,并且当时根本不适用于其他浏览器。

虽然它没有回答您的问题,但 HTTP 1.1 支持请求管道,因此至少可以重复使用相同的 TCP 连接来下载多个图像。

【讨论】:

    【解决方案3】:

    您可以使用 base64 编码将(非常小的)图像嵌入到 HTML 文档中,但是从浏览器/服务器的角度来看,您在技术上仍然只发送一个文档。也许这就是你打算做的?

    Embedd Images into HTML using Base64

    编辑:我刚刚意识到我在谷歌搜索中找到的大多数方法只支持 firefox,而不支持 iE。

    【讨论】:

    【解决方案4】:

    您可以创建一个包含多个数据 url 的 json。

    例如:

    {
        "stamp.png": "data:image/png;base64,...",
        "document.pdf": "data:application/pdf;base64,..."
    }
    

    【讨论】:

      【解决方案5】:

      (扩展trinalbadger587's answer

      您可以返回一个包含多个可点击、可下载、就地数据链接的 html:

      <html>
      <body>
        <a download="yourCoolFilename.png" href="data:image/png;base64,...">PNG</a>
        <a download="theFileGetsSavedWithThisName.pdf" href="data:application/pdf;base64,...">PDF</a>
      </body>
      </html>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-31
        • 1970-01-01
        • 2013-08-20
        • 2010-09-11
        • 1970-01-01
        相关资源
        最近更新 更多