На работе мы пытаемся загрузить файлы с веб-страницы в веб-службу, используя 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), данные будут полностью отличаться от оригинала, поэтому я думаю, что здесь я на правильном пути, но что-то немного не так.