Cordova 的 FileTransfer 写入错误(代码 1)

问题描述 投票:0回答:3

我正在使用适用于 Android 的 Cordova 4.2.0。

我无法让 FileTransfer 插件正常工作。估计是写错了

exception:".myApp\/contentImages\/20150110220101.jpg: open failed: ENOENT (No such file or directory)"

filename 之前已测试过但尚不存在:

rootFS.getFile('.myApp/contentImages/'+file,{create:false},
    function(){
        console.log(file+' already exists');
    },
    function(error){
        console.log(file+" does not exist locally");
        console.log("Error #"+error.code);
        download(file);
    }
);

这是下载功能:

function download (filename){
    var localPath = rootFS.fullPath+'/.myApp/contentImages/'+filename;
    var fileTransfer = new FileTransfer();
    fileTransfer.download(
        encodeURI('http://distantApp/contentImages/'+filename), // This file exists
        localPath,
        function(entry) {
            console.log("download complete: " + entry.fullPath);
        },
        function (error) {
            console.log('download error: ' + error.code + ": "+error.exception+" ; source " + error.source+" ; target " + error.target);
        }
    );
}

可能是什么问题?

编辑 代码

rootFS

function onDeviceReady(){
    window.requestFileSystem  = window.requestFileSystem || window.webkitRequestFileSystem;
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, function(){
        console.log("error requesting LocalFileSystem");
    });
}
function gotFS(fileSystem) {
    console.log("got filesystem: "+fileSystem.name); // displays "persistent"
    console.log(fileSystem.root.fullPath); // displays "/"
    window.rootFS = fileSystem.root;
}
javascript android cordova file-transfer cordova-plugins
3个回答
12
投票

该问题是由 Cordova 从之前版本升级引起的。

未正确识别本地文件的路径:

.fullPath
现已过时,应替换为
.toURL()


2
投票

我认为您的问题不在于 FileTransfer 插件,而在于您尝试检查文件是否存在的方式。

看这里:http://www.html5rocks.com/en/tutorials/file/filesystem/您将看到,访问其直接父级不存在的文件会引发异常:

在回调中,我们可以使用要创建的文件的名称调用 fs.root.getFile() 。您可以传递绝对或相对路径,但它必须有效。例如,尝试创建一个其直接父级不存在的文件是一个错误。

我想知道问题是否是您的文件的父文件不存在。在本例中为文件夹 .myapp 和 contentImages。


0
投票

代码 1 可能是访问问题。 就我而言,文件权限存在问题。 如果您使用的 sdk 版本低于 29 (android 10),您必须强制用户授予读取权限

const filesPermissions = (permissions) => [
 permissions.READ_EXTERNAL_STORAGE,
 permissions.WRITE_EXTERNAL_STORAGE,
];

const checkFilesPermissions = async () => {
  const { permissions } = window.cordova.plugins;
  return Promise.all(filesPermissions(permissions).map(permission => {
    return new Promise((resolve, reject) => permissions.checkPermission(permission, resolve, reject));
  })).then(statuses => statuses.every(status => status.hasPermission));
};

const requestFilesPermissions = async () => {
    const { permissions } = window.cordova.plugins;
    return new Promise((resolve, reject) => {
        permissions.requestPermissions(filesPermissions(permissions), resolve, reject);
  }).then(status => status.hasPermission);
};

if (deviceService.isAndroidPlatform()) {
  try {
    let hasFilesPermissions = await checkFilesPermissions();
    console.log(hasFilesPermissions, 1);
    if (!hasFilesPermissions) {
      hasFilesPermissions = await requestFilesPermissions();
      console.log(hasFilesPermissions, 2);
    }
    if (!hasFilesPermissions) {
      throw new Error('There is no permissions to download files. Please enable it in system preferences');
    }
  } catch (error) {
    alert(error.message)
  }
}

注意:您必须在 AndroidManifest.xml 中启用 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE

© www.soinside.com 2019 - 2024. All rights reserved.