Cordova fileTransfer 在 iOS 上完美运行,在 Android 上抛出错误代码 = 1

Posted

技术标签:

【中文标题】Cordova fileTransfer 在 iOS 上完美运行,在 Android 上抛出错误代码 = 1【英文标题】:Cordova fileTransfer works perfect on iOS, throws error code = 1 on Android 【发布时间】:2014-09-20 18:49:35 【问题描述】:

我正在使用 Cordova 和 Ionic 框架开发适用于 iosandroid 的移动应用程序。需要有“发送照片”和相关功能,我正在使用 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.takePicsend 通过按钮单击调用。有很多警报和控制台,因为我试图找出它不起作用的原因。

从 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 sim 上它会发送照片、得到正确响应、更改头像...一切。

Cordova 和插件 File 和 FileTransfer 都是最新的。

【问题讨论】:

只是error code =1? logcat 或控制台中没有可以提供更多提示的内容? 我有完全相同的问题,只是相反。我可以使用 android 上传图像,而不是使用 iOS。只得到错误代码1,我知道这是一个找不到文件的代码。 【参考方案1】:

看起来你可能有路径错误,如果我没记错的话,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

【讨论】:

感谢您的回复,这个路径错误是一个错字:) 但我肯定会尝试检查旧插件版本 哦哈哈,我只是想这很容易解释找不到文件错误:)【参考方案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:我总是得到“请登录”作为响应,即使我尝试添加所有需要的标头、令牌、任何东西......

因此,即使此解决方案与我想要实现的目标相去甚远 - 它仍然有效。希望它可以帮助任何人。

【讨论】:

嗨,我也有同样的问题,所以我想知道你最后不得不切换到 angular.js 而不是使用cordova文件传输?? 是的,如您在上面看到的纯 javascript + Angular.js,我用来使其工作的确切代码

以上是关于Cordova fileTransfer 在 iOS 上完美运行,在 Android 上抛出错误代码 = 1的主要内容,如果未能解决你的问题,请参考以下文章

Cordova/Phonegap 无法识别 FileTransfer

Cordova FileTransfer 中止错误

用于图像上传的 Cordova FileTransfer 插件错误代码 1

Cordova/Phonegap FileTransfer.upload() 错误代码 = 1 (FILE_NOT_FOUND_ERR)

Cordova iOS 视频标签本地文件源

用于将文件下载到 iOS 的 Cordova 文件传输插件