multipart / form-data中的二进制行(文件上传)

时间:2013-03-27 16:54:43

标签: http multipartform-data

我在python中编写一个简单的Web服务器,允许用户使用multipart / form-data上传文件。据我所知,多部分MIME数据应该是基于行的。例如,边界必须位于一条线的开头。

我无法弄清楚在这方面如何处理二进制数据。我的客户端(Firefox)将其编码为7位ASCII或任何东西,它只是它发送的原始二进制数据。它是否将数据拆分为任意位置的行?是否为多部分数据指定了最大行长度?我已经尝试通过RFC查看multipart / form-data,但没有找到任何内容。

2 个答案:

答案 0 :(得分:8)

在深入了解RFC之后,我想我终于彻底解决了这个问题。身体部位(即multipart/*消息中的单个部分的身体内容)仅需要基于行,因为部分末尾的边界以CR+LF开头。但除此之外,数据不一定是基于行的,如果内容恰好包含换行符,它们之间没有最大距离,也不需要进行转义(好吧,除非{{1}是引用字符串)。 Content-Transfer-Encoding的7位,8位和二进制选项实际上并不表示已对数据进行了任何编码(因此不需要撤消编码),它们只是表示您可以在正文部分看到的数据类型。

我在[表达不好]的问题中真正得到的是如何从套接字中读取/缓冲数据,这样我就能确保抓住边界,而不必拥有任意大的缓冲区(例如,如果内容中恰好没有换行符,那么Content-Transfer-Encoding最终会缓冲整个内容。)

我最终做的是使用readline使用最大长度从套接字缓冲,因此缓冲区永远不会长于此,但如果遇到换行符,也会确保终止。这确保了当边界到来时(在readline之后),它将位于缓冲区的开头。我不得不做一些额外的工作,以确保我没有在实际的身体内容中包含最终CR+LF,因为根据RFC,它在边界之前是必需的,因此不是内容本身的一部分。 / p>

答案 1 :(得分:2)

尝试审核RFC 2045。通常情况下, 二进制内容转换为BASE64 由您的应用程序使用“Content-Transfer-Encoding:Base64”包含在多部分消息中。 还有其他传输二进制数据的机制,但这很常见。二进制数据是 转换成八位字节并以任意长度字符串分块(取决于编码变体 - 请参阅 上面的BASE64链接)。接收申请 然后将其解码为原始二进制内容。

我不是一个python程序员,但我很惊讶你真的必须自己编写任何代码。我怀疑有预建的python库函数可以帮到你。