数据(文件上传)
我正在用Python编写一个简单的网络服务器,允许用户使用multipart / form-data上传文件。 据我所知,多部分MIME数据应该是基于行的。 例如,边界必须在一行的开头。
我无法弄清楚在这方面如何处理二进制数据。 我的客户端(Firefox)不会将它编码为7位ASCII或任何其他内容,它只是它发送的原始二进制数据。 它是否将数据分成任意位置的行? 是否为多部分数据指定了最大行长度? 我试着通过RFC查看multipart / form-data,但没有找到任何东西。
在深入了解RFC之后,我想我终于明白了我的想法。 正文部分(即multipart/*
消息中单个部分的正文内容)只需要基于行,因为部分末尾的边界以CR+LF
开始。 但除此之外,数据不一定是基于行的,如果内容恰巧有换行符,它们之间没有最大距离,也不需要在任何时候逃脱(当然,除非Content-Transfer-Encoding
是带引号的字符串)。 Content-Transfer-Encoding
的7位,8位和二进制选项实际上并不表示对数据进行了任何编码(因此不需要撤消编码),它们只是用来指示您可以期望在正文部分看到的数据类型。
我在[我的表达不佳]问题中真正得到的是如何从套接字中读取/缓冲数据,以便我可以确保捕获边界,而不必拥有任意大的缓冲区(例如,如果发生了这种情况在内容中没有换行符,所以readline
结束了缓冲整个事情)。
我最终做的是使用最大长度的readline
从套接字缓冲,所以缓冲区永远不会比这更长,但是如果遇到换行符,它也会确保终止。 这确保了当边界到达时(在CR+LF
),它将在缓冲区的开始处。 为了确保我没有在实际内容中包含最终的CR+LF
,我必须做一些额外的琐事,因为根据RFC它是在边界之前需要的,因此不是内容本身的一部分。
尝试查看RFC 2045.通常,二进制内容由应用程序转换为BASE64,并使用“Content-Transfer-Encoding:Base64”包含在多部分消息中。 还有其他的机制来传输二进制数据,但这很常见。 二进制数据被转换为八位位组并且在任意长度字符串中分块(取决于编码变体 - 参见上面的BASE64链接)。 接收应用程序然后将其解码为原始二进制内容。
我不是一个Python程序员,但我会感到很惊讶,你真的必须自己编写任何代码。 我怀疑有预构建的python库函数来为你做这个。
链接地址: http://www.djcxy.com/p/3779.html上一篇: data (file upload)