【问题标题】:How to get the real file size of a file in a multipart/form-data request如何在多部分/表单数据请求中获取文件的实际文件大小
【发布时间】:2015-12-09 16:57:31
【问题描述】:

正如标题所说,我需要获取作为multipart/form-data 请求发布的文件的实际文件大小。

我在 JSF 领域工作,但我认为问题与技术无关(仅取决于 HTTP)。

Content-Length 标头中指定的值不够,因为它包括边界和其他表单参数。

示例请求(仅正文):

-----------------------------355432893771247592819421210
Content-Disposition: form-data; name="composeform"

composeform
-----------------------------355432893771247592819421210

Content-Disposition: form-data; name="javax.faces.ViewState"

-9107117821100047188:3613431652649065231
-----------------------------355432893771247592819421210
Content-Disposition: form-data; name="file"; filename="3byte.txt"
Content-Type: text/plain

abc

-----------------------------355432893771247592819421210--

请求正文的最后一部分包含文件,在本例中是一个名为“3byte.txt”的文件,其中包含字符“abc”。

如您所见,文件大小不包含在请求中,因此我看到获取值的唯一方法是根据 Content-Length 标头和大小边界和其他表单参数。

其他要求:

  • 解决方案不必读取/解析整个请求来获取文件大小(这显然很容易)
  • 请求中可能有更多的表单参数,在包含文件的部分之前或/之后(与我的示例相反)

没有解决问题的类似问题:

【问题讨论】:

    标签: file-upload http-headers multipartform-data


    【解决方案1】:
    1. 您不能期望为multipart 消息设置 Content-Length 标头(某些多部分请求类型甚至禁止内容长度标头)。只需要要么 Content-Length 标头 Transfer-Encoding 标头存在。

    2. 多部分消息的一部分中不能有Content-Length 标头。

    但是,您的发件人可能在处置标头中设置一个附加参数。您可以利用它来设置文件大小,如下所示:

    Content-Disposition: form-data; name="file"; filename="3byte.txt"; size=123
    

    但这纯粹是可选的,参数的名称是任意的,并且发送者不需要包含这个参数。这意味着,HTTP 服务器引擎永远不能依赖它。

    【讨论】:

    • 看来确实没有标准的解决方案,所以我现在接受这个答案。
    猜你喜欢
    • 2020-04-10
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2015-04-04
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    相关资源
    最近更新 更多