(以下是迟到但完整的答案)
FileReader 方法支持
FileReader.readAsBinaryString()
is 已弃用。不要使用它!它不再在W3C 文件 API 工作草案:
void abort();
void readAsArrayBuffer(Blob blob);
void readAsText(Blob blob, optional DOMString encoding);
void readAsDataURL(Blob blob);
注意:请注意File
是一种扩展Blob
结构。
Mozilla 仍然实现readAsBinaryString()
并在中描述它MDN FileApi 文档:
void abort();
void readAsArrayBuffer(in Blob blob); Requires Gecko 7.0
void readAsBinaryString(in Blob blob);
void readAsDataURL(in Blob file);
void readAsText(in Blob blob, [optional] in DOMString encoding);
背后的原因readAsBinaryString()
我认为弃用如下:JavaScript 字符串的标准是DOMString
它只接受 UTF-8 字符,而不接受随机二进制数据。因此,不要使用 readAsBinaryString(),这根本不安全且不符合 ECMAScript。
我们知道JavaScript 字符串不应该存储二进制数据但 Mozilla 在某种程度上可以。我认为这很危险。Blob
and typed arrays
(ArrayBuffer
以及尚未实施但不必要的StringView
)的发明目的只有一个:允许使用纯二进制数据,不受 UTF-8 字符串限制。
XMLHttpRequest上传支持
XMLHttpRequest.send()有以下调用选项:
void send();
void send(ArrayBuffer data);
void send(Blob data);
void send(Document data);
void send(DOMString? data);
void send(FormData data);
XMLHttpRequest.sendAsBinary()有以下调用选项:
void sendAsBinary( in DOMString body );
sendAsBinary() 不是标准,Chrome 可能不支持。
解决方案
所以你有几个选择:
-
send()
the FileReader.result
of FileReader.readAsArrayBuffer ( fileObject )
。操作起来比较复杂(你必须为它创建一个单独的 send() ),但它是推荐方法.
-
send()
the FileReader.result
of FileReader.readAsDataURL( fileObject )
。它会产生无用的开销和压缩延迟,需要在服务器端执行解压缩步骤,但很容易在 Javascript 中作为字符串进行操作。
- 不符合标准且
sendAsBinary()
the FileReader.result
of FileReader.readAsBinaryString( fileObject )
MDN指出:
发送二进制内容(如文件上传)的最佳方法是使用
ArrayBuffers 或 Blob 与 send() 方法结合使用。然而,
如果要发送可字符串化的原始数据,请使用 sendAsBinary()
方法,或 StringView(非本机)类型数组超类。