【问题标题】:Sending binary data from jQuery ajax to PHP将二进制数据从 jQuery ajax 发送到 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,你正在做。

标签: php jquery json post binary


【解决方案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']阅读它

【讨论】:

    猜你喜欢
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2019-01-07
    相关资源
    最近更新 更多