我正在使用 parse.com rest api https://www.parse.com/docs/rest#files我正在尝试从 cordova 应用程序上传照片。我正在使用 ngCordova 项目 wrapper的 file plugin和 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 header 吗? IMO 发送 Content-type: mime/multipart 而不是 Docs 指定的内容。一般来说,如果插件只是格式化 REST api 文档中提到的 header ,并且如果文件字节包装在请求正文中的 Http.Entity 中,你会没事的。
使用“-v”开关自己调用 curl 示例列出 header 是个不错的主意,然后测试您的应用程序是否转储 http header (如果需要,还有 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
关于rest - 使用 cordova 文件传输插件上传到 parse.com 时损坏的 jpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25336648/