Rest 使用cordova文件传输插件上载到parse.com时,压缩了jpeg

Rest 使用cordova文件传输插件上载到parse.com时,压缩了jpeg,rest,cordova,parse-platform,mime-types,content-type,Rest,Cordova,Parse Platform,Mime Types,Content Type,我正在使用parse.com rest api,我正在尝试从cordova应用程序上载照片。我正在使用和的ngCordova项目 当我上传一张照片时,它不知怎么被破坏了。看 如果我将post requestsContent Type更改为application/json,我们将看到以下内容,这相当于上传的jpeg的十六进制转储 --+++++org.apache.cordova.formBoundary Content-Disposition: form-data; name="file"; f

我正在使用parse.com rest api,我正在尝试从cordova应用程序上载照片。我正在使用和的ngCordova项目

当我上传一张照片时,它不知怎么被破坏了。看

如果我将post requests
Content Type
更改为
application/json
,我们将看到以下内容,这相当于上传的jpeg的十六进制转储

--+++++org.apache.cordova.formBoundary
Content-Disposition: form-data; name="file"; filename="no-filename"
Content-Type: image/jpeg
Content-Length: 35476

<binary>
--+++++org.apache.cordova.formBoundary--

您可以从cordova请求中转储http头吗?IMO的发送内容类型:mime/multipart,而不是文档指定的内容。一般来说,如果插件只是格式化RESTAPI文档中提到的头文件,并且如果文件字节被包装在请求主体中的Http.Entity中,那么就可以了

使用“-v”开关调用curl samples self来列出标题是个不错的主意,然后,测试你的应用程序转储http标题(如果需要,还包括连接),以验证你发送的是curl发送的内容

curl -v -X POST  -H "X-Parse-Application-Id: AbR" -H "X-Parse-REST-API-Key: kuI9"  -H "Content-Type: image/*"  --data-binary '@test.png' https://api.parse.com/1/files/test.png

答案是插件的api与parse期望的格式不兼容。我求助于使用javascript sdk的file方法和摄像头插件的DATA_URL方法

您可以使用REST api从cordova应用程序上传文件

在控制器中:

var cameraOptions = {
    destinationType: 0, // base64
    encodingType: 0 
};

$scope.takePicture = function() {
    cameraOptions.sourceType = 1;
    navigator.camera.getPicture(onSuccess, onFail, cameraOptions);
}

$scope.selectPicture = function() {
    cameraOptions.sourceType = 0;
    navigator.camera.getPicture(onSuccess, onFail, cameraOptions);
}

function onSuccess(picture) {

    File.upload(picture)
        .success(function(data) {
            // upload finish
        });

    $scope.$apply(function() {
        $scope.preview = 'data:image/jpeg;base64,' + picture;
    });
}

function onFail(resp) {
    alert('Error: ' + resp);
}
文件内服务:

angular.factory('File', function ($http) {
    return {
        upload: function (photo) {

            var json = {
                'base64': photo,
                '_ContentType': 'image/jpeg'
            }

            var config = {
                method: 'POST',
                url: 'https://api.parse.com/1/files/pict.jpg',
                data: json,
                headers: {
                    'X-Parse-Application-Id': 'XXXXX',
                    'X-Parse-REST-API-Key': 'XXXXX'
                }
            };

            return $http(config);
        }
    }
});

目前,文件传输插件发送多种形式的部件数据,将多部件头添加到有效负载中。服务器可能不接受多部分头。尝试从master安装文件传输版本,该版本声明: '如果存在名为Content Type的标题,则不会使用多部分表单数据。'

您可以从master安装文件传输插件:
cordova插件添加https://github.com/apache/cordova-plugin-file-transfer.git

我花了一段时间才明白这是我删除多部分标题的方式

开放式: \platforms\android\src\org\apache\cordova\filetransfer\filetransfer.java

寻找:

sendStream.write(beforeDataBytes);
totalBytes += beforeDataBytes.length;

注释掉或删除这两行。它们是添加多部分标题的代码。

我做了两项更改,对我来说很有效

1.  <preference name="CameraUsesGeolocation" value="false" />
  2.  In camera options 
      saveToPhotoAlbum:true
1。
2.相机内选项
saveToPhotoAlbum:正确

这肯定是一个api问题。该插件不支持不指定
文件
文件名
键、值对。我现在正致力于直接使用文件API和$http angular服务,绕过插件。我添加了这个标题,图像很好:“内容类型”:“多部分/表单数据”
1.  <preference name="CameraUsesGeolocation" value="false" />
  2.  In camera options 
      saveToPhotoAlbum:true