2017-02-20 21 views
1

Это мой код:readAsBinaryString() не работает должным образом

var reader = new FileReader(); 
reader.onload = function(e) { 
    download(reader.result, "Test.stl"); 
} 
reader.readAsBinaryString(input_file_field.files[0]); 

Результат файла:

Result file

Исходный файл:

Original file

Выход почти то же самое с небольшими различиями (и это i s не проблема функции «загрузить», то же самое, если я помещаю журнал в консоль).

Любые идеи о том, что происходит?


Edit:

Это код, я использую для бинарного преобразования (не работает ни):

var reader = new FileReader(); 
reader.onload = function(e) { 
    var fileData = reader.result; 
    var bytes = new Uint8Array(fileData); 
    var binaryText = ''; 

    for (var index = 0; index < bytes.byteLength; index++) { 
     binaryText += String.fromCharCode(bytes[index]); 
    } 

    download(binaryText, "Test.stl"); 
} 
reader.readAsArrayBuffer(input_field.files[0]); 
+0

Из страницы MDN в ['readAsBinaryString'] (https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsBinaryString): * Обратите внимание, что этот метод теперь устарел в соответствии с 12 Июль 2012 Рабочий проект от W3C. * И * Этот метод был удален из стандарта FileAPI. Вместо этого следует использовать FileReader.readAsArrayBuffer(). * ... Так, может быть, это? –

+0

Что такое настройка «MIME» в текстовом редакторе? Почему вы не используете '.readAsText()'? – guest271314

+0

Использование 'readAsText' привело к такому же результату: файл поврежден. Я также попытался использовать 'readAsArrayBuffer', а затем преобразовать в Uint8Array, но у меня есть тот же результат, что и с' readAsBinaryString'. – fsinisi90

ответ

3

После чтения файла, как ArrayBuffer содержание будет в двоичном формате (в виде массива необработанных байтов).

Эта линия:

binaryText += String.fromCharCode(bytes[index]); 

может, однако, столовыми до вещей, как любые значения вне диапазона ASCII (0-127) подлежит 16-битной кодировке Юникода (UTF-16/ОСК-2), и исходный байт может в конечном итоге использовать два символа для представления значения источника.

Вы можете видеть, например, где первое различие происходит в позиции 0x55, значение байта 0xB3 (179 в десятичном значении) и вне диапазона ASCII становится 0xC2B3. Следующее значение 0xEF (239 в десятичной форме) становится 0xC3AF, тогда следующий 0x3E сохраняется, так как он равен < 128 и т. Д.

Однако нет никаких оснований для перехода через этот шаг преобразования, хотя, поскольку данные уже находятся в двоичном формате. Весь цикл может (и должен) быть удален.

Просто назначьте представление массиву ArrayBuffer (как и перед шагом преобразования) и используйте его для чтения данных по индексу/положению.

Если вы намерены анализировать формат, я бы рекомендовал использовать DataView вместо Uint8Array, поскольку файлы имеют тенденцию определять переменную ширину полей данных, а DataView является более гибким и удобным в этих ситуациях.

Если это для передачи на сервер/магазин для загрузки, вы можете просто сохранить исходный файл blob и отправить его в основном как есть (см. Первый test fiddle).

 Смежные вопросы

  • Нет связанных вопросов^_^