【问题标题】:Content-Transfer-Encoding in file uploading request文件上传请求中的 Content-Transfer-Encoding
【发布时间】:2011-07-07 08:48:41
【问题描述】:

我正在尝试使用 XMLHTTPRequest 上传文件并发送此标头:

Content-Type:multipart/form-data, boundary=xxxxxxxxx

--xxxxxxxxx
Content-Disposition: form-data; name='uploadfile'; filename='123_logo.jpg'
Content-Transfer-Encoding: base64
Content-Type: image/jpeg
/*base64data*/

但在服务器端 PHP 忽略标头“Content-Transfer-Encoding: base64” 并将base64未解码的数据直接写入文件!

有什么办法可以解决吗?

附言使用base64发送数据很重要

【问题讨论】:

  • 为什么要手动构建标题?为什么以 base64 编码而不是二进制发送它很重要?
  • 因为 Google Chrome 中没有实现方法 xhr.sendAsBinary()。

标签: php javascript http-headers xmlhttprequest


【解决方案1】:

Xavier 的回答听起来不对。 RFC2616 也有这样的说法(第 3.7 节):

一般来说,HTTP 处理多部分 消息体与
没有什么不同 任何其他媒体类型:严格为 有效载荷。一个例外是
“多部分/字节范围”

在我看来,RFC2616 的第 19.4 节将 HTTP 作为一个整体来讨论,因为它使用类似于 MIME 的语法(如标头格式),但 兼容 MIME .

另外,还有RFC2388。在section 3,最后一段,它说:

每个部分都可以被编码,并且 “内容传输编码”标头
如果该部分的值提供 不符合默认
编码。

Section 4.3对此进行了详细说明:

4.3 编码

虽然 HTTP 协议可以传输任意二进制数据,但 邮件传输的默认值是 7BIT 编码。提供的价值 对于一部分可能需要编码和“内容传输编码” 如果值不符合默认值,则提供标头 编码。 [更多详情请参阅section 5 of RFC 2046。]

【讨论】:

  • 同意。这绝对是 PHP 中的一个错误。您强调的 W3C HTML 文档和 RFC 都非常清楚地表明,在对表单的 POST 响应中,可以使用Content-Transfer-Encoding。这是有道理的,因为否则文本字段可能会无意中包含 MIME 边界序列,并且都必须使用 Content-Length 以二进制形式发送。
  • 这不是 PHP 中的“错误”,也不是 PHP 特有的。从我对此的研究来看,多部分 POST 似乎完全是一团糟,IETF RFC 大多没用,需要更新。 RFC 2388 需要彻底改革,HTML 4.01 的w3.org/TR/html401/interact/forms.html 参考也是如此。基本上。没有现代 UA 使用 content-transfer-encoding,您必须使用 content-type 来确定编码。不仅如此,假设字符集与初始请求表单的字符集相同,并且不使用多个文件的“multipart/mixed”。也一样;亲吻。
【解决方案2】:

我之前的回答错了

Content-Transfer-Encoding 可能出现在复合体中

http://www.ietf.org/rfc/rfc2616.txt

这有几个后果。复合的实体主体 类型可以包含许多正文部分,每个部分都有自己的 MIME 和 HTTP 标头(包括 Content-MD5、Content-Transfer-Encoding 和 内容编码标头)。

【讨论】:

  • 谢谢!使用 base64_decode 是非常丑陋的方法,但我想我别无选择。
  • 旧的 RFC1867 for multipart/form-data 可能也相关。它提到了用于邮件传输的 Content-Transfer-Encoding,但在 HTTP 中不需要。这就是为什么 PHPs rfc1867.c 不尊重它的原因。
猜你喜欢
  • 2023-02-10
  • 1970-01-01
  • 2011-11-09
  • 2017-10-03
  • 2019-09-22
  • 2013-12-25
  • 2014-03-30
相关资源
最近更新 更多