http - HTTP 文件上传如何工作?

标签 http file-upload multipartform-data

当我提交一个像这样的简单表单并附上文件时:

<form enctype="multipart/form-data" action="http://localhost:3000/upload?upload_progress_id=12344" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="100000" />
Choose a file to upload: <input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>

它如何在内部发送文件?文件是否作为数据作为 HTTP 正文的一部分发送?在此请求的 header 中,我没有看到与文件名相关的任何内容。

我只是想知道发送文件时 HTTP 的内部工作原理。

最佳答案

让我们看看当您选择文件并提交表单时会发生什么(为简洁起见,我截断了标题):

POST /upload?upload_progress_id=12344 HTTP/1.1
Host: localhost:3000
Content-Length: 1325
Origin: http://localhost:3000
... other headers ...
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryePkpFF7tjBAqx29L

------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="MAX_FILE_SIZE"

100000
------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="uploadedfile"; filename="hello.o"
Content-Type: application/x-object

... contents of file goes here ...
------WebKitFormBoundaryePkpFF7tjBAqx29L--

注意:每个边界字符串必须有一个额外的前缀--,就像在最后一个边界字符串的末尾一样。上面的示例已经包含了这一点,但很容易错过。请参阅下面@Andreas 的评论。

不是对表单参数进行 URL 编码,而是将表单参数(包括文件数据)作为请求正文中的多部分文档中的部分发送。

在上面的示例中,您可以看到输入 MAX_FILE_SIZE 以及在表单中设置的值,以及包含文件数据的部分。文件名是 Content-Disposition header 的一部分。

完整的详细信息是 here .

关于http - HTTP 文件上传如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8659808/

相关文章:

swift - 如何在 alamofire 中使用自定义动词?

http - 使用 node.js 代理 HTTP 请求的值(value)

javascript - 不允许使用 Codeigniter/PHP(405 错误)在 jQuery Blueimp FileUpload 上删除方法?

node.js - org.springframework.web.multipart.MultipartException : Could not parse multipart servlet request. ..流意外结束

php - 图像未通过 Objective C 中的 POST 上传到服务器

c# - 如何在 ASP NET 中通过公共(public) API 通过 HTTP 发布文件?

python - 处理来自 WSGI 请求的文件

objective-c - AFNetworking后台文件上传

post - 在带有 SuiteScript 2.0 的 NetSuite 中,无法使用内容类型为 multipart/form-data 的 HTTP POST 请求发送文件

linux - 需要在 OpenSUSE Linux 中启用 http