我用Python写一个简单的Web服务器,它允许用户使用的multipart / form-data的上传文件。 据我所知,多MIME数据应该是基于行的。 例如,边界必须是在一行的开头。
我无法弄清楚如何数据二进制在这方面的处理。 我的客户(火狐) 没有编码成位的ASCII或任何东西,它只是原始的二进制数据它发送。 它是否将数据分割为任意位置线? 有没有多的数据指定的最大行长度? 我试图寻找通过RFC的多/表单数据,但没有发现任何东西。
我用Python写一个简单的Web服务器,它允许用户使用的multipart / form-data的上传文件。 据我所知,多MIME数据应该是基于行的。 例如,边界必须是在一行的开头。
我无法弄清楚如何数据二进制在这方面的处理。 我的客户(火狐) 没有编码成位的ASCII或任何东西,它只是原始的二进制数据它发送。 它是否将数据分割为任意位置线? 有没有多的数据指定的最大行长度? 我试图寻找通过RFC的多/表单数据,但没有发现任何东西。
通过RFC的挖掘后,我想我终于在我的脑袋把一切都直。 的身体部位(即,一个单独的部分的一个的主体内容multipart/*
消息)只需要基于行的,在所述部分的端部的边界开始于CR+LF
。 但除此之外,数据不一定是基于行的,如果内容碰巧有它的换行符,它们之间没有最大距离,也不需要在反正(逃脱,除非也许是Content-Transfer-Encoding
是带引号的字符串)。 7位,8位和二进制的选项Content-Transfer-Encoding
实际上并不表明任何编码已经针对该数据执行(因此没有编码需要被撤销),他们只是为了说明数据的类型,你可以期望的身体部位看。
我真的在得到我的[不善表达]问题是如何读/从套接字缓冲区中的数据,这样我可以确保我抓住了边界,而无需有一个任意大的缓冲区(例如,如果有发生要在内容没有换行符,等等readline
最终缓冲整个事情)。
我落得这样做是从一个插座缓冲readline
使用的最大长度,因此缓冲区永远不会超过15分钟,但也将确保终止,如果遇到断行。 这保证了当边界来(继CR+LF
),这将是在缓冲区的开始。 我不得不做一些额外的胡闹周围,以确保我没有包括最后的CR+LF
在实际的正文内容,因为根据RFC它的边界之前需要真实,因此不是内容本身的一部分。
请详阅RFC 2045 。 通常,二进制内容被转换成BASE64 “:Base64的内容传输编码”,由应用程序使用,并包括在多部分消息。 还有其它机制来传送二进制数据,但是这是很常见的。 二进制数据被转换成八位位组和在arbitary长度字符串(取决于编码的变体 - 参见上面的BASE64链路)分块的。 接收应用程序然后将其解码成原来的二进制内容。
我不是一个Python程序员,但我会感到惊讶它你真的有任何的这种自行编码。 我怀疑有预置的Python库函数来为你做这个。