我正在使用parse.com rest api https://www.parse.com/docs/rest#files我正在尝试从cordova应用程序上传照片。我正在使用wrapper和file plugin的ngCordova项目file transfer plugin。
当我上传照片时,它以某种方式被损坏。参见http://files.parsetfss.com/73b88ac0-8858-4f64-92bf-de6aaf29f525/tfss-7b54f8e8-77fd-4e3d-bbbe-83bf67bb08d0-profile-image.jpeg
如果我将发布请求Content-Type
更改为application/json
,我们将看到以下http://files.parsetfss.com/73b88ac0-8858-4f64-92bf-de6aaf29f525/tfss-219ecbb4-091f-45e6-9da1-35ad84022db6-profile-image.jpeg,它相当于上载的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--
将该图像加载到预览中会发出警告,表明它已损坏。在photoshop中,它已正确加载,因此信息在那里,只是有些损坏。
我怀疑cordova文件传输插件不成熟,默认情况下会添加不需要的参数file
和filename
。而且无法删除它们。参见https://github.com/apache/cordova-plugin-file-transfer/blob/master/doc/index.md#upload
如何使用其余api和文件传输插件将jpeg二进制文件上传到parse.com?
profilesController.js
// uploads photo to rest api given local file_uri
$scope.addPhoto = function() {
var options = {};
options.mimeType = 'image/jpeg';
options.headers = {
'X-Parse-Application-Id': 'my-id',
'X-Parse-REST-API-Key': 'my-key',
'Content-Type': 'image/jpeg'
};
$cordovaFile.uploadFile('https://api.parse.com/1/files/profile-image.jpeg', $scope.imageSrc, options).then(function(result) {
console.log('result:', result);
$ionicLoading.hide();
}, function(err) {
// An error occured. Show a message to the user
});
};
您可以从cordova请求中转储http标头吗? IMO的发送内容类型:mime / multipart,而不是文档指定的内容类型。通常,如果插件仅格式化REST api文档中提到的标头,并且文件字节包装在请求正文中的Http.Entity中,就可以了。
[使用“ -v”开关自己列出列表头然后调用curl示例,然后测试您的应用程序转储http头(如果需要,则为WIRE),以验证您发送的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
[当前,文件传输插件发送多形式零件数据,该数据将多零件头添加到有效载荷。也许服务器不接受多部分标题。尝试从master安装文件传输版本,其中指出:“如果存在名为Content-Type的标头,则不会使用多部分表单数据。”
答案是插件的api与解析所期望的格式不兼容。我求助于使用javascript sdk的文件方法https://www.parse.com/docs/js_guide#files-classes和相机插件的DATA_URL方法https://github.com/apache/cordova-plugin-camera/blob/master/doc/index.md#options
您可以使用REST api从cordova应用程序上传文件。
花些时间让我想一想这是我删除多部分标题的方式。
我进行了2项对我有用的更改。