2014-01-05 3 views
1

Я пытаюсь отправить двоичные данные как часть сложного типа. Модель для моего типа примерно такая:Отправка двоичных данных в сообщение ajax

class Message 
{ 
    /* various properties that are ints/dates*/ 
    int type; 
    datetime datedeleted; 
    etc ... 
    /*blob type which is actually a byte array*/ 
    byte[] messagecontent; 

} 

Итак, у меня есть два метода REST. Один конвертирует и загружает файл в наш проприетарный формат, а затем отправляет его обратно как сложный тип, который я затем храню в переменных формы.

self.createMessage = function() { 
     self.loading(true); 
     var formdata = new FormData(); 
     jQuery.each($('#file')[0].files, function (i, file) { 
      formdata.append('file-' + i, file); 
     }); 
     dataModel.createMessage(formdata) 
     .done(function (data) { 
      self.messageValue(data.MessageValue); 

Так что, если вы проверяете страницу, вы увидите что-то вроде этого:

<input type="hidden" id="MessageValue" data-bind=" value: messageValue" value="iVBORw0KGgoAAAANSUhEUgAAAfQAAAHRCAYAAACct0sPA ... /> 

Я тогда другую функцию, которая срабатывает, когда пользователь нажимает отправить.

self.sendMessage = function() { 

     dataModel.sendMessage({ 
      MessageType: self.messageType(), 
      ToUser: { 
       UserName : self.selectedContactName() 
      }, 
      MessageValue: window.atob(self.messageValue()), 

Эта линия: MessageValue: window.atob (self.messageValue()),

Я попробовал это и без atob. Я попытался изменить кодировку содержимого. Я пробовал его с помощью «data: image/png; base64», + messageValue().

Ни один из них не работает. Веб-сервис генерирует ошибку проверки о том, что он не может преобразовать данный текст в байты

Я забыл добавить код dataModel.sendMessage

self.sendMessage = function (data) { 
     return $.ajax(messageSendUrl, { 
      type: "POST", 
      data: data, 
      headers: getSecurityHeaders() 
     }); 
    }; 
+0

При отправке объекта FormData через jQuery ajax вы должны указать 'contentType: false, processData: false' в своем вызове. – Musa

+0

Почему вы пытаетесь это сделать. Это экономить пропускную способность? В этом случае все содержимое может быть сжато вашим веб-сервером? –

ответ

0

Я действительно решил пойти другим путем. В моей модели я изменил тип из байтового массива на строку, и только base64 закодировал его, а затем я укоротил его во втором вызове.

0

Javascript обеспечивает небольшую поддержку для чтения двоичных данных по умолчанию. Вы можете изучить его сериализацию. Существует несколько библиотек, которые могут выполнять некоторую форму двоичных данных, читающих afaik.

Посмотрите что-нибудь наподобие this или https://github.com/vjeux/jParser.

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