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

Posted

技术标签:

【中文标题】用于将文件下载到 iOS 的 Cordova 文件传输插件【英文标题】:Cordova File Transfer plugin to download a file to iOS 【发布时间】:2018-12-29 09:20:06 【问题描述】:

我正在使用下面的代码下载并在我的手机存储中保存一个文件。

    var downloadUrl = encodeURI(cordova.file.dataDirectory + fileName);
    var fileTransfer = new FileTransfer();

    fileTransfer.download(
    "http://developer.android.com/assets/images/home/ics-android.png",
    downloadUrl,
    function(entry) 
    alert("download complete: " + entry.fullPath);
    ,

    function(error) 
    alert("download error source " + error.source);
    alert("download error target " + error.target);
    alert("upload error code" + error.code);
    );

此代码在任何 android 设备上都可以正常工作,但在 iPhone 上无法正常工作,并出现以下错误。

    download error source " the url used"
    download error target: " the target used "
    upload error code 1

我是 ios 新手,有人可以帮我解决这个问题吗?并让我知道在执行此代码之前应授予的任何权限...

【问题讨论】:

【参考方案1】:

文件传输插件已被弃用一段时间(一年多),您可能不应该花太多时间让文件传输插件正常工作。我建议按照博客文章中的说明操作transition off the file api。

所以对于您的代码(未经测试,但应该可以工作):

window.requestFileSystem(cordova.file.dataDirectory, 0, function (fs) 
    console.log('file system open: ' + fs.name);
    fs.root.getFile(fileName,  create: true, exclusive: false , function (fileEntry) 
        console.log('fileEntry is file? ' + fileEntry.isFile.toString());
        var oReq = new XMLHttpRequest();
        // Make sure you add the domain name to the Content-Security-Policy <meta> element.
        oReq.open("GET", "http://developer.android.com/assets/images/home/ics-android.png", true);
        // Define how you want the XHR data to come back
        oReq.responseType = "blob";
        oReq.onload = function (oEvent) 
            var blob = oReq.response; // Note: not oReq.responseText
            if (blob) 
                fileEntry.createWriter(function (fileWriter) 

                    fileWriter.onwriteend = function() 
                        console.log("Successful file write...");                        
                    ;

                    fileWriter.onerror = function (e) 
                        console.log("Failed file write: " + e.toString());
                    ;

                    fileWriter.write(blob);
                );
             else 
                console.error('we didnt get an XHR response!');
            
        ;
        oReq.send(null);
    , function (err)  
        console.error('error getting file! ' + err); 
    );
, function (err)  
    console.error('error getting persistent fs! ' + err); 
);

【讨论】:

当我使用cordova.file.dataDirectory 时,我收到一个错误wrong type of parameter type of requestFileSystem: expected number, but got string。然后当我将其更改为localFileSystem.PERSISTENT - 它似乎有效,但我无法在任何地方找到该文件 根据LocalFileSystem的文档,该方法已经过时了,那么它是指cordova-plugin-file插件,在Supported Systems下面是These platforms do not support FileReader.readAsArrayBuffer nor FileWriter.write(blob).【参考方案2】:

为了让它在 iOS 中运行,我必须将 create() 放入平台就绪检查中。

constructor(platform: Platform, filetransfer: FileTransfer) 
    platform.ready().then(() => 
       this.Transfer = filetransfer.create();
    


download(fileName)

    let lLocation = this.file.cacheDirectory + fileName;

    this.Transfer.download(
    "http://developer.android.com/assets/images/home/ics-android.png",
    lLocation).then().catch

【讨论】:

以上是关于用于将文件下载到 iOS 的 Cordova 文件传输插件的主要内容,如果未能解决你的问题,请参考以下文章

Cordova Background Fetcher 插件不适用于 iOS

使用 cordova 文件传输将图像/视频保存到 IOS 中的画廊

将cordova文件插件添加到现有ios项目时重复符号_kCDVFilesystemURLPrefix

用于 Visual Studio 的 Apache cordova 在构建期间不会更新 iOS 平台文件

Cordova 写入 WWW 目录 (iOS)

Cordova iOS 视频标签本地文件源