如何在 multipart/form-data 请求中获取文件的真实文件大小
How to get the real file size of a file in a multipart/form-data request
正如标题所说,我需要获取作为 multipart/form-data
请求发布的文件的真实文件大小。
我在 JSF 世界,但我认为问题是 technology-agnostic(仅取决于 HTTP)。
Content-Length header 中指定的值不够,因为它包括边界和其他表单参数。
示例请求(仅限 body):
-----------------------------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--
请求的最后一部分 body 包含文件,在本例中是名为“3byte.txt”的文件,其中包含字符 "abc"。
如您所见,文件大小未包含在请求中,因此我看到获取该值的唯一方法是根据 Content-Length[=45 计算它=] header 以及边界大小和其他表单参数。
附加要求:
- 解决方案不必 read/parse 获取文件大小的整个请求(这显然很容易)
- 请求中可能有更多的表单参数,在包含文件的部分之后 or/and 之前(与我的示例相反)
类似问题未解决问题:
- How to know the file size when uploading via multipart form-data?
- Get file size from multipart form upload Content-Length header
- Calculate size multipart/form-data encoded file
您不能期望 Content-Length header 是为 multipart
消息设置的(某些多部分请求类型甚至禁止内容长度 header ).只需要存在 a Content-Length
header or a Transfer-Encoding
header .
多部分消息的一部分不能有Content-Length
header。
但是,您的发件人 可以 在处置 header 中设置一个附加参数。您可以利用它来设置文件大小,如下所示:
Content-Disposition: form-data; name="file"; filename="3byte.txt"; size=123
但这纯粹是可选的,参数的名称是任意的,并且不需要发送者包含此参数。这意味着,HTTP 服务器引擎永远不能依赖它。
正如标题所说,我需要获取作为 multipart/form-data
请求发布的文件的真实文件大小。
我在 JSF 世界,但我认为问题是 technology-agnostic(仅取决于 HTTP)。
Content-Length header 中指定的值不够,因为它包括边界和其他表单参数。
示例请求(仅限 body):
-----------------------------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--
请求的最后一部分 body 包含文件,在本例中是名为“3byte.txt”的文件,其中包含字符 "abc"。
如您所见,文件大小未包含在请求中,因此我看到获取该值的唯一方法是根据 Content-Length[=45 计算它=] header 以及边界大小和其他表单参数。
附加要求:
- 解决方案不必 read/parse 获取文件大小的整个请求(这显然很容易)
- 请求中可能有更多的表单参数,在包含文件的部分之后 or/and 之前(与我的示例相反)
类似问题未解决问题:
- How to know the file size when uploading via multipart form-data?
- Get file size from multipart form upload Content-Length header
- Calculate size multipart/form-data encoded file
您不能期望 Content-Length header 是为
multipart
消息设置的(某些多部分请求类型甚至禁止内容长度 header ).只需要存在 aContent-Length
header or aTransfer-Encoding
header .多部分消息的一部分不能有
Content-Length
header。
但是,您的发件人 可以 在处置 header 中设置一个附加参数。您可以利用它来设置文件大小,如下所示:
Content-Disposition: form-data; name="file"; filename="3byte.txt"; size=123
但这纯粹是可选的,参数的名称是任意的,并且不需要发送者包含此参数。这意味着,HTTP 服务器引擎永远不能依赖它。