FileReader方法支持
FileReader.readAsBinaryString()
已被弃用,不要使用它!它不再出现在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在某种程度上可以这样做。我认为这很危险。为了允许使用纯二进制数据,而不受UTF-8字符串限制,发明了
Blob
和
typed arrays
(
ArrayBuffer
和尚未实现但不必要的
StringView
)。
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()
FileReader.readAsArrayBuffer ( fileObject )
的 FileReader.result
。它更复杂,需要单独为其创建一个发送(send)操作,但这是建议的方法。
send()
FileReader.readAsDataURL( fileObject )
的 FileReader.result
。它会产生无用的开销和压缩延迟,需要在服务器端进行解压步骤,但可以轻松地作为Javascript中的字符串进行操作。
使用非标准的 sendAsBinary()
,则是将 FileReader.readAsBinaryString( fileObject )
的 FileReader.result
发送出去。
MDN 指出:
上传二进制内容(例如文件上传)的最佳方式是使用ArrayBuffers或Blobs与send()方法一起使用。 但是,如果要发送可用字符串表示的原始数据,请改用sendAsBinary()方法,或使用StringView(非本机)类型化数组超类。
FormData
。 - Ja͢ck