Кордова fileTransfer отлично работает на iOS, выдает код ошибки = 1 на Android

Я разрабатываю мобильное приложение для iOS и Android с использованием Cordova и Ionic Framework. Должна быть «Отправить фото» и связанные с ней функциональные возможности, и я использую FileTransfer Cordova для этого.

Он отлично работает на симуляторе 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 вызываются нажатием кнопок. Есть много предупреждений и консоли, потому что я пытаюсь найти, почему он не работает.

После выбора изображения из галереи на андроиде я получаю:

Файл: ///storage/sdcard0/download/file-name.jpg

На симуляторе iOS:

Файл: ///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 sim он отправляет, фото, получает правильный ответ, меняет аватар … все.

И Кордова, и плагины File и FileTransfer обновлены.

Похоже, что у вас может быть ошибка пути, file:///storage.sdcard0/download/file-name.jpg должен быть file:///storage/sdcard0/download/file-name.jpg если я не ошибаюсь ,

Из просмотра вашего кода, похоже, что вы ничего не разбираете. Возможно, вы хотите попробовать использовать более старую более стабильную версию плагина, если он возвращает неправильный URI (и, возможно, файл сообщает об ошибке)? Я не использовал файловый плагин, так как они выпустили 1.0, но из личного опыта были проблемы с ошибками / регрессиями в предыдущих выпусках.

Вы можете настроить таргетинг на определенные версии плагина из кордовы-cli, используя @ например cordova plugin add org.apache.cordova.file@1.0.0

Помимо конкретных тегов / выпусков от github, используя # например cordova plugin add https://github.com/apache/cordova-plugin-file-transfer#r0.4.2

Может быть, поздно, но я как-то исправил это.

В моем файле просмотра я использую:

 <input id="file" name="file" type="file" onchange="angular.element(this).scope().addFile(this)" class="upload" accept="image/*" capture="camera"/> 

Поэтому он запускает $scope.addFile() из моего контроллера, как только вы берете файл из галереи:

 $scope.addFile = function(item){ function uploadComplete(evt) { /* This event is raised when the server send back a response */ $scope.imgId = JSON.parse(evt.target.responseText).data; $scope.$apply(); $http.post($rootScope.baseServerUrl + 'Members/changeAvatar', {attachment_id: $scope.imgId}).success( function (response){ console.log(response); $scope.User.attachment_id = $scope.imgId; $scope.$apply(); }); } function uploadFailed(evt) { alert("There was an error attempting to upload the file.") }; var updateImage = function (element) { $scope.$apply(function() { $scope.theFile = element.files[0]; var formData = new FormData(); formData.append("file", $scope.theFile); var xhr = new XMLHttpRequest() xhr.addEventListener("load", uploadComplete, false) xhr.addEventListener("error", uploadFailed, false) xhr.open("POST", $scope.baseServerUrl + "media/Attachments/add") xhr.setRequestHeader("Accept","application/json") $scope.progressVisible = true xhr.send(formData); }); }; updateImage(item) } 

Работает на всех Android-устройствах, которые я тестировал, выше 4.0, исключая 4.4 из-за input type="file" bug , работает на симуляторе iOS и устройствах с системой 8.1 (также должен быть старше, но я не тестировал его).

Это не идеальное решение, потому что вы можете использовать только фотографии, которые вы уже получили на своем телефоне. Я не мог понять, как использовать Cordova FileTransfer с нашим способом аутентификации сервера: я всегда получал «пожалуйста, войдите» в ответ, даже когда я попытался добавить все необходимые заголовки, токены, что угодно …

Поэтому, хотя это решение далека от того, чего я хотел достичь – он работает. Надеюсь, это поможет кому угодно.