MIME分界符有哪些规则适用?

41
当您编写MIME时,需要使用特定的边界符号来分隔消息中的不同块。我因某些原因未能找到任何解释此边界符号的文档,但以下是我从示例中收集到的信息:
  1. 边界可以是任何字母和数字的字符串,例如"d29a0c638b540b23e9a29a3a9aebc900aeeb6a82"。
  2. 生成边界没有规则,您可以使用您爱人的名字进行md5sum计算,这样就得到了您的边界。
  3. 如果您正在通过HTTP发送MIME,则必须添加一个标题"Content-Type",以指定您正在发送的内容类型和您的边界,标题内容可能如下所示:
  4. multipart/form-data; boundary=d29a0c638b540b23e9a29a3a9aebc900aeeb6a82

  5. 在消息正文中,边界应该以"--"开头,例如:
  6. --d29a0c638b540b23e9a29a3a9aebc900aeeb6a82

但是,即使按照这些规则(和这个有用的答案),我仍然无法生成服务器接受的POST请求。我是否漏掉了什么?我理解错了吗?
1个回答

64

边界语法的语法为:

 boundary := 0*69<bchars> bcharsnospace
 bchars := bcharsnospace / " "
 bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" /
                  "+" / "_" / "," / "-" / "." /
                  "/" / ":" / "=" / "?"

而一个多部分实体的正文语法如下(只有重要部分):

 multipart-body := [preamble CRLF]
                   dash-boundary transport-padding CRLF
                   body-part *encapsulation
                   close-delimiter transport-padding
                   [CRLF epilogue]
 dash-boundary := "--" boundary
 encapsulation := delimiter transport-padding
                  CRLF body-part
 delimiter := CRLF dash-boundary
 close-delimiter := delimiter "--"

在消息中,每个边界都必须使用前缀--,并且关闭边界(close-delimiter)必须使用后缀--。因此,具有三个主体部分的多部分主体,其boundaryboundary,可能如下所示:

--boundary
1. body-part
--boundary
2. body-part
--boundary
3. body-part
--boundary--

3
请解释“transport-padding”是什么意思。 - Adarsh Rajput
2
在结束边界后,我们需要CRLF吗? - Dee
1
@johnlowvale [CRLF 结尾] 所以根据BNF语法我猜结尾使用CRLF是可选的。请参考变体部分。 - Sany Liew
边界中可以使用表情符号吗? - Marais Rossouw
@MaraisRossouw:只能使用“字母数字US-ASCII字符”。表情符号无法在此范围内表示(虽然您可以先将字符串进行base64编码,但为什么要这样做呢?) - Oleg Valter is with Ukraine
一些表情符号可以用 :-) 表示,但是你只能使用 ASCII。 - Jasen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接