Загрузка большого двоичного объекта с помощью FormData, содержимое файла пусто

Я пытаюсь загрузить большой двоичный объект с помощью FormData на Chrome. Я создаю веб-приложение. Пользователь может создать профиль и выбрать аватар, который является тегом img. Когда я пытаюсь выполнить запрос ajax, я создаю холст с изображением и вызываю на нем toDataURL. Затем я преобразую данные в двоичный контент с помощью этой функции

    dataURItoBlob: function(dataURI) {
      var binary = atob(dataURI.split(',')[1]);
      var array = [];
      for(var i = 0; i < binary.length; i++) {
        array.push(binary.charCodeAt(i));
      }
      return new Blob([new Uint8Array(array)], {type: 'application/octet-stream'});
    }

Когда blob создан, я добавляю его в formData и отправляю запрос ajax (с помощью jquery). Дело в том, что содержимое файла кажется пустым.

 ------WebKitFormBoundarysToAVAYMLPFfJF96
 Content-Disposition: form-data; name="image"; filename="avatar.png"
 Content-Type: application/octet-stream


 ------WebKitFormBoundarysToAVAYMLPFfJF96--

Используя FileReader, я делаю readAsText для большого двоичного объекта, и он действительно имеет контент:

 �PNG


 IHDR�
 IDATx^���������v�"�`���^[l��N�����׸�k�؁�X�B�[�i�eٜ����yg����E�dF����o~���{�s�sN(�˲�_t�ɤ����݇ns(Z�6ڇ>�O}}��b��l�����ks�̱��r�w�}��{��x<޲}�Q644XNN�;޷�~k7�|��z��V[[�����o�����rss��WTTXII�UWW[^^^��455Yqq���Ը��ߏ>���Xc
 ���s��o��Yg�ew�y�566��...

Кто-нибудь уже сталкивался с этой проблемой? Я просто не понимаю, почему запрос отправляет пустой файл.


person Elendir    schedule 20.11.2013    source источник
comment
Инструменты разработчика Chrome на самом деле не отображают содержимое файлов в данных формы. Вы получили пустой файл в сценарии на стороне сервера?   -  person Musa    schedule 20.11.2013
comment
Не я разрабатываю серверный скрипт. Я спрошу разработчика сервера, но думаю, вы правы. Есть ли способ сохранить файлы в инструментах разработчика? В любом случае, могу ли я опубликовать свой комментарий в качестве ответа, чтобы я мог его принять?   -  person Elendir    schedule 21.11.2013


Ответы (1)


Инструменты разработчика Chrome на самом деле не отображают содержимое файлов в данных формы, проверьте сторону сервера, чтобы убедиться, что файл действительно пуст. Firebug (плагин для Firefox) показывает вам часть данных файла, вы также можете использовать такие инструменты, как fiddler, чтобы просмотреть тела сообщений http.

person Musa    schedule 21.11.2013
comment
Кроме того, хотя большой двоичный объект является данными, а не (обязательно) файлом, он все равно будет поступать как сервер для загрузки файлов. Например. в PHP ожидайте это как запись $ _FILES, а не как запись $ _POST. (Сочетание этого и того, что я не видел этого в инструментах разработчика Chrome, стоило мне сегодня нескольких часов ..) - person Arthur; 23.08.2017