(Ниже приводится поздний, но полный ответ)
Поддержка методов FileReader
FileReader.readAsBinaryString()
является устаревшим. Не используйте его! Его больше нет в рабочем проекте W3C File 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
и 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()
FileReader.result
из FileReader.readAsArrayBuffer ( fileObject )
. Сложнее манипулировать (вам придется создать для него отдельный send ()), но это РЕКОМЕНДУЕМЫЙ ПОДХОД .
send()
FileReader.result
из FileReader.readAsDataURL( fileObject )
. Он генерирует бесполезные издержки и задержку сжатия, требует этапа распаковки на стороне сервера, НО его легко манипулировать как строку в Javascript.
- Будучи нестандартным и
sendAsBinary()
FileReader.result
из FileReader.readAsBinaryString( fileObject )
MDN гласит:
Лучший способ отправки двоичного содержимого (например, при загрузке файлов) - это использование
ArrayBuffers или Blobs в сочетании с методом send (). Тем не мение,
если вы хотите отправить необработанные данные в виде строк, используйте sendAsBinary ()
вместо этого, или суперкласс типизированных массивов StringView (не собственный).