2014-11-15 3 views
4

В настоящее время я пытаюсь загрузить файл на свой сервер. Но я не уверен, как это сделать с readAsArrayBuffer. Это работает, если я использую readAsBinaryString.Javascript - Загрузка файла, readAsArrayBuffer?

Если я пытаюсь console.log, он возвращает 'arrayBuffer: {}'. После того, как я попытался загрузить его, я вижу внутри сообщения, что был отправлен только пустой объект. Если я использую readAsBinaryString, я вижу кучу двоичного кода.

var file = document.getElementById('my_file').files[0], 
    reader = new FileReader(); 

    reader.onloadend = function(e){ 
     console.log(e.target.result); 
     $scope.image = e.target.result; 
    } 

    reader.readAsArrayBuffer(file); 

Как я могу просмотреть свой файл, поэтому я знаю, что он работает при использовании readAsArrayBuffer? Если требуется больше кода, дайте мне знать! Благодарю.

+1

попытке войти в длину буфера 'console.log (e.target.result.byteLength)'. Код, скорее всего, будет работать, но консольное представление 'ArrayBuffer' - это просто' arrayBuffer: {} ', а не куча бинарных файлов. – dreyescat

+0

dreyescat - Спасибо, да, теперь я получаю выход! –

ответ

0

Если вы хотите загрузить изображение, то вы должны преобразовать его в формат base64. Вы можете сделать это либо с помощью холста элемента или с помощью Filereader.If вы используете FileReader, то вы должны использовать readAsDataURL()

Вы можете обратиться MDN для этого https://developer.mozilla.org/en-US/docs/Web/API/FileReader.readAsDataURL

также вы можете использовать холст элемент Convert an image to canvas that is already loaded

+0

Спасибо за ответ. Да, я планирую использовать fileReader. У меня будет форма с некоторыми полями ввода, включая ввод файла. Затем я хочу отправить данные формы, включая изображение, с помощью POST. Является ли readAsDataURL еще способ пойти? –

+0

да почему бы и нет? readAsDataURL - это просто способ преобразования изображения в строку формата base64. Вы можете сохранить его в переменной и отправить его в форме или сохранить в базе данных –

8

Согласно ArrayBuffer документации

Вы не можете напрямую управлять содержимое ArrayBuffer; вместо этого вы создаете один из типизированных объектов массива или объект DataView, который представляет буфер в определенном формате, и используйте это для чтения и записи содержимого буфера.

Так как я заметил, прежде чем, вероятно, console.log не знает, как представить буфер, и поэтому он просто выводит arrayBuffer: {}.

Если вы хотите показать что-то в консоли, вам нужно использовать типизированный массив или DataView. Например, с использованием Int8Array:

reader.onloadend = function (e) { 
    console.log(e); 
    console.log(new Int8Array(e.target.result)); 
}; 

См demo

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