我正在使用Cordova和Ionic Framework为iOS和Android开发移动应用程序 . 需要“发送照片”和相关功能,我正在使用Cordova的FileTransfer来执行此操作 .
它在iOS模拟器上运行完美,但在Android设备上抛出“错误代码= 1” .
我知道这意味着 file_not_found
或类似的 .
请注意,如果我从相机拍照,或从图库中选择一张照片,就会发生这种情况 .
这是我的代码:
$scope.takePic = function() {
var options = {
quality: 50,
destinationType: navigator.camera.DestinationType.FILE_URI,
sourceType: 0, // 0:Photo Library, 1=Camera, 2=Saved Photo Album
encodingType: 0 // 0=JPG 1=PNG
}
navigator.camera.getPicture(onSuccess, onFail, options);
}
var onSuccess = function(FILE_URI) {
window.resolveLocalFileSystemURL(FILE_URI, function(fileEntry) {
alert("full: " + JSON.stringify(fileEntry));
var realUrl = fileEntry.toURL();
$scope.picData = realUrl;
$scope.$apply();
console.log("real URL", realUrl);
});
};
var onFail = function(e) {
console.log("On fail " + e);
}
function win(r) {
console.log("Code = " + r.responseCode);
console.log("Response = " + r.response);
console.log("Sent = " + r.bytesSent);
Flash.success("Wysłano");
var response = JSON.parse(r.response);
$scope.attachment_id = response.data;
$scope.$apply();
$http.post($rootScope.baseServerUrl + 'Members/changeAvatar', {attachment_id: response.data}).success( function (response){
console.log(response);
});
}
function fail(error) {
alert("An error has occurred: Code = " + error.code);
console.log("upload error source " + error.source);
console.log("upload error target " + error.target);
}
$scope.send = function() {
Flash.warning('wysyłam');
var myImg = $scope.picData;
alert(myImg);
var options = new FileUploadOptions();
options.headers = {
Accept: "application/json",
Connection: "close"
}
options.fileKey="file";
options.fileName=$scope.picData.substr($scope.picData.lastIndexOf('/')+1);
options.mimeType="image/jpeg";
options.chunkedMode = false;
var ft = new FileTransfer();
ft.upload(myImg, encodeURI($rootScope.baseServerUrl + 'media/Attachments/add'), win, fail, options);
}
按钮点击调用 $scope.takePic
和 send
. 有很多警报和控制台,因为我试图找到它无法正常工作的原因 .
从android上的画廊中挑选一张照片后,我得到:
file:///storage/sdcard0/download/file-name.jpg
在iOS模拟器上:
file:///Users//Library/Application%20Support/iPhone%20Simulator/7.1/Applications/B5FB2081-54E7-4335-8856-84C6499E6B07/tmp/cdv_photo_038.jpg
通过使用此路径,我可以使用 <img src="{{picData}}">
显示此图片,这适用于两个平台 .
但是,如果我尝试在Android设备上发送它,我会收到错误代码= 1.在iOS上,它会发送,照片,获得正确的响应,更改头像......一切 .
Cordova和插件File和FileTransfer都是最新的 .
2 回答
看起来你可能有一个路径错误,
file:///storage.sdcard0/download/file-name.jpg
应该是file:///storage/sdcard0/download/file-name.jpg
如果我没有弄错的话 .通过仔细阅读代码,您似乎没有错误地解析任何内容 . 也许你想尝试使用较旧的更稳定版本的文件插件,如果它返回错误的URI(并可能提交错误报告)?我没有使用过该文件插件,因为他们发布了1.0,但从个人经验来看,之前的版本中出现了错误/回归 .
您可以使用
@
(例如cordova plugin add org.apache.cordova.file@1.0.0
)从cordova-cli定位特定的插件版本以及来自github的特定标签/版本使用
#
,如cordova plugin add https://github.com/apache/cordova-plugin-file-transfer#r0.4.2
也许迟到但我已经修好了 .
在我的视图文件中,我使用:
一旦你从galery拿起文件,它就会从我的控制器中激活
$scope.addFile()
:适用于我测试过的所有Android设备,4.0以上,因为
input type="file" bug
不包括4.4,适用于iOS模拟器和8.1系统的设备(也应该在较旧但我没有测试它) .这不是一个完美的解决方案,因为您只能使用手机上已有的图片 . 我无法弄清楚如何使用我们的服务器身份验证方式使用Cordova FileTransfer:即使我尝试添加所有需要的 Headers ,令牌,任何东西,我总是得到“请登录”作为回应 .
所以即使这个解决方案远非我想要实现的目标 - 它仍然有效 . 希望它能帮助任何人 .