PHP收到消息后,TestStream发布的AngularJS最终会变大
我在AngularJS应用程序和PHP后端之间的传输/接收过程中遇到了一个二进制流“增长”的问题 这篇文章和我在其他地方所做的很普通…但是,这篇文章混合了文本和二进制数据。。。我不确定这是否足够PHP收到消息后,TestStream发布的AngularJS最终会变大,php,json,angularjs,Php,Json,Angularjs,我在AngularJS应用程序和PHP后端之间的传输/接收过程中遇到了一个二进制流“增长”的问题 这篇文章和我在其他地方所做的很普通…但是,这篇文章混合了文本和二进制数据。。。我不确定这是否足够 var req = { method: 'POST', url: 'putInitialPicture.php', data : { "xuserid" : $scope.user.id, "xaut
var req = {
method: 'POST',
url: 'putInitialPicture.php',
data : {
"xuserid" : $scope.user.id,
"xauthtoken" : $scope.user.authtoken,
"data" : picdata
}
};
console.log("posting....");
$http(req)
.success(function (data, status, headers, config) {
console.log("returned from post");
console.log(data);
$scope.sync($scope.user.id);
})
.error(function(data, status, headers, config) {
console.log("error result");
console.log(data);
});
在PHP代码的接收函数中,我做了正常的
$postdata = file_get_contents("php://input");
$_POST = json_decode($postdata, true);
获取已发布的数据
在脚本的后面,执行验证并确定目标文件名后,使用简单的
file_put_contents("$basename/$fname",$_POST['data']);
这就是事情发生的地方。。。有趣
写入的文件(图像文件-JPG)与我从角度读取的文件不同。文件(由读取数据的角度代码报告)为5727字节
数据通过PHP发布、解码并写入磁盘后,磁盘上的大小为9992字节
在服务器、客户机和服务器之间的某个地方,它并没有翻倍。我可以忽略最初的GET操作,因为正在检索的内容被报告为正确的大小
似乎在文章的某个地方,二进制流发生了一些事情,使得它能够被发送,而不仅仅是一个简单的JSON解码能够处理。。。。但我不知道是什么
我是否需要在帖子上设置一个标题,以便Web服务器正确解码数据?或者在使用之前是否需要对$_POST['data']对象进行额外解码
我不知道下一步该怎么办。。我在谷歌搜索的问题/答案都是简单的文本。。。不是文本/二进制文章的组合
编辑-解决方案-排序
发送二进制数据只是个坏主意。取而代之的是,我选择了重用我已经在使用的上传服务。这需要创建一个文件对象(更一般地说是blob),我可以将从远程服务器下载的字节放入其中,从而产生:
$scope.CreateBlob = function(Data, contentType) {
contentType = contentType || '';
var sliceSize = 1024;
var byteCharacters = Data;
var bytesLength = byteCharacters.length;
var slicesCount = Math.ceil(bytesLength / sliceSize);
var byteArrays = new Array(slicesCount);
for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
var begin = sliceIndex * sliceSize;
var end = Math.min(begin + sliceSize, bytesLength);
var bytes = new Array(end - begin);
for (var offset = begin, i = 0 ; offset < end; ++i, ++offset) {
bytes[i] = byteCharacters[offset].charCodeAt(0);
}
byteArrays[sliceIndex] = new Uint8Array(bytes);
}
return new Blob(byteArrays, { type: contentType });
}
已经在$scope.files上设置了$watch,上载“刚好发生”
但现在奇怪的是。。。$http.get(…)返回的picdata字符串比服务器所说的要短。根据标题,图像的长度应该是5886字节
接受范围:字节缓存控制:最大年龄=84600,公共,无转换
内容长度:5886
内容类型:图像/jpeg
日期:2015年9月27日星期日04:06:10 GMT
ETag:“c01bf-16fe-520b2957e00e9”
到期时间:2015年9月28日星期一03:36:10 GMT
最后修改日期:2015年9月27日星期日03:57:47 GMT
服务器:Apache/2.2.22(Debian) 然而,当我记录picdata.length时,我得到了5727字节
不同的问题。。不同的一天,从未发送图像为JSON…应该考虑发送FrimDATA对象。Angular没有图像api…如何读取图像?@charlietfl。。正在使用一个简单的
$http.get($url)
读取图像,上面的代码段作为.success
子句。。。。返回的字节字符串与原始文件在磁盘上的大小匹配。您是否建议在本例中避免使用$http.post,并使用我自己的?也许可以对base64块数据集(如表单数据)进行预编码,然后在服务器上解码?我原以为一个简单的url(en/de)代码就可以了。。。但是生成的文件太大了(它从5727字节增长到9992字节……我就是不明白。)我应该不能在JS端使用encodeURIComponent(string)
然后$decoded=urldecode($\u post['data'])作为字符串发布吗代码>在PHP中??我认为URL编码背后的整个想法是,它编码了会在传输过程中引起问题的污点。。。它不应该添加未知数。。。
var blob = $scope.CreateBlob( picdata ,"image/jpg");
$scope.files = [];
$scope.files.push(blob);