在ajax帖子中发送二进制数据

时间:2014-01-05 16:03:25

标签: jquery asp.net ajax knockout.js asp.net-web-api

我正在尝试将二进制数据作为复杂类型的一部分发送。我的类型的模型是这样的:

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()尝试了它。

这些似乎都不起作用。 Web服务抛出一个验证错误,指出它无法将给定文本转换为byte

我忘了添加dataModel.sendMessage的代码

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

2 个答案:

答案 0 :(得分:0)

默认情况下,Javascript几乎不支持读取二进制数据。你可以考虑序列化它。有一些库可以做某种形式的二进制数据读取。

请参阅thishttps://github.com/vjeux/jParser

答案 1 :(得分:0)

我实际上决定走另一条路。在我的模型中,我将类型从字节数组更改为字符串,只需对其进行base64编码,然后在第二次调用时将其取消编码。