Rest 使用cordova文件传输插件上载到parse.com时,压缩了jpeg
我正在使用parse.com rest api,我正在尝试从cordova应用程序上载照片。我正在使用和的ngCordova项目 当我上传一张照片时,它不知怎么被破坏了。看 如果我将post requestsRest 使用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
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