【问题标题】:Sending binary data in an ajax post在 ajax 帖子中发送二进制数据
【发布时间】:2014-01-23 00:21:54
【问题描述】:

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

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 服务抛出一个验证错误,指出它无法将给定的文本转换为字节

我忘记添加 dataModel.sendMessage 的代码

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

【问题讨论】:

  • 通过 jQuery ajax 发送 FormData 对象时,您必须在调用中指定 contentType: false, processData: false
  • 你为什么要这么做。是为了节省带宽吗?在这种情况下,您的网络服务器可以压缩所有内容?

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


【解决方案1】:

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

查看thishttps://github.com/vjeux/jParser 之类的内容。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-12-16
      • 1970-01-01
      • 2016-06-06
      • 2015-11-22
      • 2021-05-02
      • 2014-10-10
      • 2013-04-08
      • 1970-01-01
      • 2017-11-14
      相关资源
      最近更新 更多