Загрузите бинарный файл, используя чистый JavaScript - PullRequest
5 голосов
/ 12 мая 2011

Я работаю над приложением Chrome, которое использует API файловой системы HTML5 и позволяет пользователям импортировать и синхронизировать файлы.У меня возникает одна проблема: если пользователь пытается синхронизировать файлы изображений, они будут повреждены в процессе загрузки на сервер.Я предполагаю, что это потому, что они двоичные.

Для загрузки я решил просто сделать запрос Ajax POST (используя MooTools), а затем поместить содержимое файла в качестве тела запроса.Я сказал MooTools отключить urlEncoding и установить для charset значение «x-user-define» (не уверен, если это необходимо, я просто видел его на некоторых веб-сайтах).

Учитывая, что Chrome не поддерживаетxhr.sendAsBinary, есть ли у кого-нибудь пример кода, который позволил бы мне отправлять двоичные файлы через Ajax?

Ответы [ 2 ]

7 голосов
/ 02 июня 2011

FF's xhr.sendAsBinary() не является стандартным.XHR2 поддерживает отправку файлов (xhr.send(file)) и больших двоичных объектов (xhr.send(blob)):

function upload(blobOrFile) {
  var xhr = new XMLHttpRequest();
  xhr.open('POST', '/server', true);
  xhr.onload = function(e) { ... };

  // Listen to the upload progress.
  xhr.upload.onprogress = function(e) { ... };

  xhr.send(blobOrFile);
}

Вы также можете отправить ArrayBuffer.

0 голосов
/ 12 мая 2011

Если вы пишете сервер, то вы можете просто преобразовать прочитанные байты в чистый текст, отправить его на сервер и затем декодировать обратно.

Вот самый простой способ (не очень эффективный, но это просто для демонстрации техники) -

преобразовать каждый байт, который вы прочитали из файла, в строку из двух шестнадцатеричных символов.Если вы прочитали байт 53 (в десятичной форме), то переведите его в «45» (шестнадцатеричное представление 53).объединить все эти строки вместе и отправить полученную строку на сервер.

На стороне сервера разбить строку на четные позиции, перевести каждую пару цифр в байт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...