Двоичные данные javascript sendfile в веб-службу

На работе мы пытаемся загрузить файлы с веб-страницы в веб-службу, используя html 5/javascript в конце браузера и С# в веб-службе. Но есть некоторые проблемы с кодировкой.

Что касается javascript, мы получаем двоичные данные файла с помощью FileReader.

var file = ... // gets the file from an input
var fileReader = new FileReader();
fileReader.onload = dataRecieved;
fileReader.readAsBinaryString(file);

function dataRecieved() {
  // Here we do a normal jquery ajax post with the file data (fileReader.result).
}

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

Код в веб-сервисе выглядит так

[WebMethod]
public string SaveFileValueFieldValue(string value)
{
  System.Text.UnicodeEncoding encoder = new UnicodeEncoding();
  byte[] bytes = encoder.GetBytes(value);
  // Saves file from bytes here...
}

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

Таким образом, файл, похоже, неправильно кодирует всего несколько байтов где-то в преобразованиях.

Я также пытался создать массив int в javascript из данных, а затем снова преобразовать в байт [] в веб-службе с той же проблемой. Если я попытаюсь преобразовать что-либо, кроме юникода (например, UTF-8), данные будут полностью отличаться от оригинала, поэтому я думаю, что здесь я на правильном пути, но что-то немного не так.


person einord    schedule 18.09.2012    source источник


Ответы (1)


Сам запрос является текстовым, поэтому двоичные данные теряются, если вы отправляете неправильный тип enc. Что вы можете сделать, так это закодировать двоичный файл в base64 и декодировать его с другой стороны.
Чтобы изменить enc-type на multi-part/mixed и установить границы (так же, как электронная почта или что-то в этом роде), вам придется собрать запрос самостоятельно.

person SparK    schedule 18.09.2012
comment
Спасибо за помощь! С вашей помощью и этим другим сообщением здесь я обнаружил, что это сработало. знак равно - person einord; 19.09.2012