边界如何在多部分帖子请求中起作用?

tyb*_*103 1 iphone post http multipartform-data http-post

我试图将文件从iPhone上传到服务器.我试图避免使用任何不是由apple制作的库,而且我可以告诉它看起来我需要在构建我的请求时达到相当低的水平.有人能告诉我multipart/form-data请求中的"边界"是什么以及如何正确使用它?

Mat*_*all 6

边界是一段任意文本,客户端使用它来分隔要发布的表单的字段.客户端声明它正在使用的边界作为Content-type标头的一部分.

HTML RFC中的IETF 基于表单的文件上载:

选择在任何数据中都不会出现的边界.(此选择有时是概率性地完成的.)表单的每个字段按其在表单中出现的顺序发送,作为多部分流的一部分.每个部分都标识原始HTML表单中的INPUT名称.如果媒体类型是已知的(例如,从文件扩展名或操作系统类型信息中推断)或作为application/octet-stream,则应使用适当的内容类型标记每个部分.

...

6.例子

假设服务器提供以下HTML:

<FORM ACTION="http://server.dom/cgi/handle"
       ENCTYPE="multipart/form-data"
       METHOD=POST>
 What is your name? <INPUT TYPE=TEXT NAME=submitter>
 What files are you sending? <INPUT TYPE=FILE NAME=pics>
 </FORM>
Run Code Online (Sandbox Code Playgroud)

并且用户在名称字段中键入"Joe Blow",并选择文本文件"file1.txt"作为"您要发送什么文件?"的答案.

客户端可能会发回以下数据:

   Content-type: multipart/form-data, boundary=AaB03x

   --AaB03x
   content-disposition: form-data; name="field1"

   Joe Blow
   --AaB03x
   content-disposition: form-data; name="pics"; filename="file1.txt"
   Content-Type: text/plain

    ... contents of file1.txt ...
   --AaB03x--
Run Code Online (Sandbox Code Playgroud)

如果用户还为"您要发送什么文件?"的答案指示了图像文件"file2.gif",则客户端可能会向客户端发回以下数据:

   Content-type: multipart/form-data, boundary=AaB03x

   --AaB03x
   content-disposition: form-data; name="field1"

   Joe Blow
   --AaB03x
   content-disposition: form-data; name="pics"
   Content-type: multipart/mixed, boundary=BbC04y

   --BbC04y
   Content-disposition: attachment; filename="file1.txt"
Run Code Online (Sandbox Code Playgroud)

在第一个示例中,边界是固定字符串AaB03x.在第二个示例中,边界首先AaB03x然后切换到BbC04y.