在我的Ionic 2应用程序中,我使用cordova-plugin-camera
拍摄照片,然后通过FILE_URL
(本地设备的图像位置)检索图片,效果很好。
在使用相机拍摄照片时,这给了我这样的网址:file:///storage/emulated/0/Android/....../1234.jpg
从图库中选择图片时就像这样:content://com.android.providers.media.documents/document/image%232312
现在我尝试使用cordova-plugin-file-transfer
上传此图片。
我的上传功能如下:
upload(){
let options: FileUploadOptions = {
fileKey: 'file',
fileName: 'my_image.jpg',
headers: {'X-CSRF-Token': localStorage.getItem('u:token')}
}
alert(this.imageSrc);
this.fileTransfer.upload(this.imageSrc, encodeURI(this.API_URL), options, true)
.then(data => {
alert("d:"+JSON.stringify(data));
}, err => {
alert("E:"+JSON.stringify(err));
});
}
但我收到一个错误对象,其中包含以下内容
{
"code" : "null",
"source" : "null",
"target" : "null",
"http_status" : "null",
"body" : "null",
"exception" : "null"
}
注意:没有其他错误正在被抛出
答案 0 :(得分:1)
修改强>
我过去使用此插件时通常会传入:
file:///Path/To/File/
或类似的东西:
cdvfile://localhost/persistent/path/to/file.txt
您还可以传递如下数据URI:
data:image/jpg;base64,iVBORw0KGgoAAA....
我看到你正在使用相机插件你试过设置相机选项来返回数据URL并发送那个吗?
navigator.camera.getPicture(onSuccess, onFail,
{
destinationType: Camera.DestinationType.DATA_URL;
});
<强>原始强>
尝试构建您的选项:
var options = new FileUploadOptions();
options.fileKey = 'file',
options.fileName = 'my_image.jpg',
options.headers = {'X-CSRF-Token': localStorage.getItem('u:token')}
然后尝试像这样上传:
var ft = new FileTransfer();
ft.upload('file_url', 'endpoint_url', success_callback, fail_callback, options);
答案 1 :(得分:0)
当我在离子视图中测试应用程序时,我面临同样的问题,但在我创建apk后问题消失并且没有出现错误。
答案 2 :(得分:0)
好的问题是,图库返回了contentURI
,而不是FileTransfer所需的fileURI
。问题出现在content:
和/storage/
URI上。
我使用了一种糟糕的练习方法,但由于它仍然没有修复,我会分享它。
我通过添加FilePath(cordova-plugin-filepath
)来修复它。
下面的函数使用存储和内容URI并将它们转换为文件路径。
(我的案例中的图像源全局)
convertIfAndroidGalleryImage() {
// android bug, sometimes returns an image starting with content: or /storage/ which won't upload.
// Convert to a filepath.
if(this.imageSrc.startsWith('content') || this.imageSrc.startsWith('/storage/')) {
if(this.imageSrc.startsWith('/storage/')) {
this.imageSrc = 'file://'+this.imageSrc;
}
this.filePath.resolveNativePath(this.imageSrc).then(filePath => {
this.imageSrc = filePath;
}).catch(err => { console.log("error occurred"); });
}
}