PHP收到消息后,TestStream发布的AngularJS最终会变大

PHP收到消息后,TestStream发布的AngularJS最终会变大,php,json,angularjs,Php,Json,Angularjs,我在AngularJS应用程序和PHP后端之间的传输/接收过程中遇到了一个二进制流“增长”的问题 这篇文章和我在其他地方所做的很普通…但是,这篇文章混合了文本和二进制数据。。。我不确定这是否足够 var req = { method: 'POST', url: 'putInitialPicture.php', data : { "xuserid" : $scope.user.id, "xaut

我在AngularJS应用程序和PHP后端之间的传输/接收过程中遇到了一个二进制流“增长”的问题

这篇文章和我在其他地方所做的很普通…但是,这篇文章混合了文本和二进制数据。。。我不确定这是否足够

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