我有一个关于这些协议设计的问题。为什么我们要使用边界来分隔多部分消息的不同部分,而不是为每个部分引入内容长度?使用长度参数会使解析更容易。我是否忽略了使用边界而不是长度参数的一些主要原因?谢谢!
我有一个关于这些协议设计的问题。为什么我们要使用边界来分隔多部分消息的不同部分,而不是为每个部分引入内容长度?使用长度参数会使解析更容易。我是否忽略了使用边界而不是长度参数的一些主要原因?谢谢!
使用长度参数会让解析更容易
这里你是错误的。多部分 MIME 的作者考虑到了一些情况,你无法预先确定消息部分的长度。想想那些改变消息长度的内容编码,如 base64、UUencode 等等。还有压缩、加密等等。另外:Content-Length
是一个实体头。这意味着如果你到达它,你已经开始解析消息部分了。与边界标记相比,它没有任何优势。
如果你研究旧协议,你会经常遇到某个标记(通常是 \0
),表示消息的结束。发送消息字节数的另一种解决方案,但在需要实时转换消息内容或以某种方式流式传输消息内容的地方,你不会经常找到它。
底线:多部分边界允许在消息内容大小不可预测的情况下进行一些有趣的应用。HTTP 服务器推送 就是一个显著的例子。
Content-Length
头部的定义与您在这里写的完全相同。 - DaSourcererapplication/x-www-form-urlencoded
的方式发送,这是更紧凑的格式方式 ;) - DaSourcerer除了DaSourcerer在他的回答中提到的内容之外,我想要指出有很多合理的原因为什么一个人可能不知道内容的长度。在评论中,最有说服力的理由已经被提及:流传输。
停止思考"文件大小"或者甚至"文件",朋友们!当构建一个MIME多部分时,创建者可能根本不读取文件而是输入流,或者她可能逐行从平台相关的读取器中读取,这又引入了LF与CRLF的问题。流可能如此庞大,以至于在将其写出之前完全读取它会非常低效甚至不可能,仅仅为了确定其大小。
最后但同样重要的是,RFC 1341规定多部分实体可以有序言(第一个边界之前的内容)和结语(最后一个边界之后的内容)。引用:
From: Nathaniel Borenstein <nsb@bellcore.com>
To: Ned Freed <ned@innosoft.com>
Subject: Sample message
MIME-Version: 1.0
Content-type: multipart/mixed; boundary="simple
boundary"
This is the preamble. It is to be ignored, though it
is a handy place for mail composers to include an
explanatory note to non-MIME compliant readers.
--simple boundary
This is implicitly typed plain ASCII text.
It does NOT end with a linebreak.
--simple boundary
Content-type: text/plain; charset=us-ascii
This is explicitly typed plain ASCII text.
It DOES end with a linebreak.
--simple boundary--
This is the epilogue. It is also to be ignored.