首页 文章

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

提问于
浏览
7

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

我无法弄清楚在这方面如何处理二进制数据 . 我的客户端(Firefox)没有将其编码为7位ASCII或任何东西,它发送的是_1045985 . 它是否将数据拆分为任意位置的行?是否为多部分数据指定了最大行长度?我找不到任何东西 .

2 回答

  • 8

    在深入了解RFC之后,我想我终于彻底解决了这个问题 . 身体部位(即, multipart/* 消息中各个部分的身体内容)只需要基于行,因为部分末端的边界以 CR+LF 开头 . 但除此之外,数据不一定是基于行的,如果内容中恰好有换行符,它们之间没有最大距离,也不需要进行转义(好吧,除非引用 Content-Transfer-Encoding )串) . Content-Transfer-Encoding don 't actually indicate that any encoding has been done on the data (and therefore no encoding needs to be undone), they'的7位,8位和二进制选项只是表示您可以在正文部分中看到的数据类型 .

    在我的[表达不好]的问题中,我真正得到的是如何从套接字中读取/缓冲数据,这样我就能确保 grab 边界,而不必拥有任意大的缓冲区(例如,如果发生了在内容中没有换行符,所以 readline 最终缓冲了整个事情) .

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

  • 2

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

    我不是一个python程序员,但我很惊讶你真的必须自己编写任何代码 . 我怀疑有预建的python库函数为你做这个 .

相关问题