如何以多部分/形式获取文件的实际文件大小

正如标题所说,我需要获取作为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头部和边界大小以及其他表单参数计算它。

其他要求:

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

  • 通过多部分表单数据上传时如何知道文件大小?
  • 从多部分表单获取文件大小上传内容长度标题
  • 计算大小多部分/表单数据编码文件

  • 您不能指望为multipart消息设置Content-Length标头(某些多部分请求类型甚至禁止内容长度标头)。 只需要Content-Length报头或Transfer-Encoding报头。

  • 多部分消息的一部分中不能包含Content-Length头。

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

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

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

    链接地址: http://www.djcxy.com/p/22219.html

    上一篇: How to get the real file size of a file in a multipart/form

    下一篇: HMAC authenticated API calls with multipart/form