2017-06-13 84 views
1

我想使用jQuery $.ajax()发送到PHP的二进制数据,但我的代码不起作用。我希望有人能帮助我一点点。从jQuery ajax发送二进制数据到PHP

我的情况:一开始,我不必处理二进制数据,我有一个AJAX调用,它工作得很好。

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

在PHP中,我使用$foo = $_POST['foo'];

再后来就检索到的数据,有必要增加数据的大小送出。 JSON太大了,我不得不寻找一个压缩lib /方法。我选择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')?我不知道)

我失去了一些东西在这里?真正感谢您的帮助。

+1

读它这是关键,'过程数据:FALSE'和你正在做它。 –

回答

0

,如果你想发送二进制数据

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 
}); 

使用FORMDATA对象(斑点),然后通过$_FILES['binData']