将二进制数据从 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_DATA
和file_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对象向服务端异步发送二进制数据