将二进制数据从 jQuery ajax 发送到 PHP

Posted

技术标签:

【中文标题】将二进制数据从 jQuery ajax 发送到 PHP【英文标题】:Sending binary data from jQuery ajax to PHP 【发布时间】:2017-11-14 22:39:40 【问题描述】:

我正在尝试使用 jQuery $.ajax() 将二进制数据发送到 php,但我的代码并不能正常工作。我希望有人可以帮助我一点。

我的情况:一开始我不需要处理二进制数据,我有一个 AJAX 调用,效果很好。

$.ajax(
      dataType: 'json'
    , type: 'POST'
    , data: foo:bar
    , url: // url to send to ...
    ...
);

在 PHP 上,我使用 $foo = $_POST['foo']; 检索数据

后来,需要增加发送数据的大小。 JSON 太大了,我不得不寻找一个压缩库/方法。我选择pako 将 json 字符串压缩成 Uint8 数组。 (如果您认为在通过 AJAX 发送 JSON 之前有更好的压缩数据的方法,请指教,谢谢。)

我的代码变成了:

var dataStr = JSON.stringify(jsonData);
var pako = window.pako;
var binData = pako.deflate(unescape(encodeURIComponent(dataStr))); // dataStr is now Uint8 array
$.ajax(
    ....
    , data:binary:binData, foo:bar... // and other data
    , contentType: false
    , processData: false
);

不知道是不是二进制格式的原因,但是在PHP端已经无法检索数据了。 我试过检查:

$_POST $HTTP_RAW_POST_DATA file_get_contents('php://input')

但我没有看到任何相关(或者我可能只是不知道如何通过var_dump/print_r 来调试$HTTP_RAW_POST_DATAfile_get_contents('php://input') 的内容?我不知道)。

我在这里遗漏了什么吗?非常感谢您的帮助。

【问题讨论】:

这是关键,processData: false,你正在做。 【参考方案1】:

如果要发送二进制数据,请使用 FormData 对象(带有 blob)

var fd = new FormData();
fd.append('binary', new Blob(binData));
fd.append('foo', 'bar');
binary:binData, foo:bar
$.ajax(
    ....
    , data:fd,
    , contentType: false
    , processData: false
);

然后通过$_FILES['binData']阅读它

【讨论】:

以上是关于将二进制数据从 jQuery ajax 发送到 PHP的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 AJAX 将 jquery 对象数据发送到 php?

jQuery中的ajaxjquery中ajax全局事件load实现页面无刷新局部加载ajax跨域请求jsonp利用formData对象向服务端异步发送二进制数据

jQuery Ajax 不将数组作为数据对象发送

使用来自 jquery 数据表的 ajax 调用发送参数

使用 AJAX + jQuery + PHP 将数据发送到 MySQL

使用 jquery AJAX 将数据发送到 php 并检索响应