Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android PhoneGap-尝试将文件复制到dataDirectory时出现错误代码5,但原因是什么?_Android_Cordova_Phonegap_Html5 Filesystem - Fatal编程技术网

Android PhoneGap-尝试将文件复制到dataDirectory时出现错误代码5,但原因是什么?

Android PhoneGap-尝试将文件复制到dataDirectory时出现错误代码5,但原因是什么?,android,cordova,phonegap,html5-filesystem,Android,Cordova,Phonegap,Html5 Filesystem,在我的应用程序中,用户可以从图库中选择图像,此图像将用于“用户详细信息”。因此,创建了一个屏幕,其中存在一个名为“file”的输入文件。我需要将选择的映像复制到externalDataDirectory 我的问题是如何从文件choosen获取URI以进行复制 我的代码是。。。但每次都会得到错误代码9,但我不知道这是什么意思 inputFile = $( '.file' ).val(); window.resolveLocalFileSystemURL( cordova.file.externa

在我的应用程序中,用户可以从图库中选择图像,此图像将用于“用户详细信息”。因此,创建了一个屏幕,其中存在一个名为“file”的输入文件。我需要将选择的映像复制到externalDataDirectory

我的问题是如何从文件choosen获取URI以进行复制

我的代码是。。。但每次都会得到错误代码9,但我不知道这是什么意思

inputFile = $( '.file' ).val();

window.resolveLocalFileSystemURL( cordova.file.externalDataDirectory, function( myFileEntry ){


    window.requestFileSystem( LocalFileSystem.PERSISTENT, 0, function(fileEntry){

        parentEntry = new DirectoryEntry( inputFile );


        myFileEntry.getDirectory( "TRETA", {create: true, exclusive: false}, function(dir){ 

            // copy the file to a new directory and rename it
            fileEntry.root.copyTo( dir, "arquivo", function(entry){
                console.log("New Path: " + entry.fullPath);
            }, function(error){
                console.log(error);
            });

        }, fail); 


    }, function(error){
        console.log( error );
    });

}, fail);
fffff

(注意:假设您要复制位于应用程序根文件夹中的文件。将其命名为
appURI

我只能为自己说话,但
LocalFileSystem.PERSISTENT
指向
file:///storage/emulated/0/
使用我的android手机(测试环境)。使用此基本URI,默认情况下您没有读/写权限,但在其子文件夹中

您要访问的文件夹应如下所示:
file:///storage/emulated/0/Android/data/YOUR_APP_NAMESPACE/
appURI

在此文件夹中,您已获得读/写权限。因此,您可以使用自己的逻辑自行获取此url,也可以使用指向
LocalFileSystem.TEMPORARY的
file:///storage/emulated/0/Android/data/YOUR_APP_NAMESPACE/cache/
用我的android手机,所以我想你也应该这样

但总而言之:

function getAppURI(callback) {
  window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, function (filesystem) {
    var cacheDir = filesystem.root.toURL();
    var startPointCacheFolderName = cacheDir.match(/\/\w+\/$/) [0];
    callback(cacheDir.replace(startPointCacheFolderName, '') + '/');
  }, function (error) {
    console.log('no access to app-filesystem');
  }
  );
}
最后,我们可以使用正确的
appURI

getAppURI(function (appURI) {
  window.resolveLocalFileSystemURL(appURI, function (fileSystem) {
    fileSystem.getFile('fileToCopy.txt', {
      create: false, // try true first to make sure that there are no other problems around
      exclusive: false
    }, function (fileEntry) {
      window.resolveLocalFileSystemURL(appURI+"NAME_OF_A_SUBFOLDER_YOU_WANT_TO_COPY_TO OTHERWISE_REPLACE_THIS_STRING", function (newFileEntry) {
        fileEntry.copyTo(newFileEntry, 'CopiedFile.txt', function (result) {
          console.log("save successfully:", result);
        }, function (err) {
          console.log("err-fileEntry.copyTo: ",err);
        });
      }, function (err) {
        console.log("err-window.resolveLocalFileSystemURL: ",err);
      });
    }, function (err) {
      console.log("err-fileSystem.getFile: ",err);
    });
  }, function (err) {
    console.log("err-resolveLocalFileSystemURL: ",err);
  });
});
希望这有帮助


还值得一提的是,错误代码并不总是表明操作无法成功的真正原因。同时还出现了读/写权限错误,错误代码(
ENCODING\u ERR 5
)也相同(请查看注释)。

(注意:假设您要复制位于应用程序根文件夹中的文件。将其命名为
appURI

我只能为自己说话,但
LocalFileSystem.PERSISTENT
指向
file:///storage/emulated/0/
使用我的android手机(测试环境)。使用此基本URI,默认情况下您没有读/写权限,但在其子文件夹中

您要访问的文件夹应如下所示:
file:///storage/emulated/0/Android/data/YOUR_APP_NAMESPACE/
appURI

在此文件夹中,您已获得读/写权限。因此,您可以使用自己的逻辑自行获取此url,也可以使用指向
LocalFileSystem.TEMPORARY的
file:///storage/emulated/0/Android/data/YOUR_APP_NAMESPACE/cache/
用我的android手机,所以我想你也应该这样

但总而言之:

function getAppURI(callback) {
  window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, function (filesystem) {
    var cacheDir = filesystem.root.toURL();
    var startPointCacheFolderName = cacheDir.match(/\/\w+\/$/) [0];
    callback(cacheDir.replace(startPointCacheFolderName, '') + '/');
  }, function (error) {
    console.log('no access to app-filesystem');
  }
  );
}
最后,我们可以使用正确的
appURI

getAppURI(function (appURI) {
  window.resolveLocalFileSystemURL(appURI, function (fileSystem) {
    fileSystem.getFile('fileToCopy.txt', {
      create: false, // try true first to make sure that there are no other problems around
      exclusive: false
    }, function (fileEntry) {
      window.resolveLocalFileSystemURL(appURI+"NAME_OF_A_SUBFOLDER_YOU_WANT_TO_COPY_TO OTHERWISE_REPLACE_THIS_STRING", function (newFileEntry) {
        fileEntry.copyTo(newFileEntry, 'CopiedFile.txt', function (result) {
          console.log("save successfully:", result);
        }, function (err) {
          console.log("err-fileEntry.copyTo: ",err);
        });
      }, function (err) {
        console.log("err-window.resolveLocalFileSystemURL: ",err);
      });
    }, function (err) {
      console.log("err-fileSystem.getFile: ",err);
    });
  }, function (err) {
    console.log("err-resolveLocalFileSystemURL: ",err);
  });
});
希望这有帮助



还值得一提的是,错误代码并不总是表明操作无法成功的真正原因。还有一个读/写权限错误,错误代码(
ENCODING\u ERR 5
)是相同的(请查看注释)。

您的解释帮助很大,但我无法从输入中获取文件。。。在日志中我得到这个。。。appURI=file:///storage/emulated/0/Android/data/br.com.johnhenrique.myapp/ 是输入文件中文件选择的正确URI:C:\fakepath\IMG-20170926-WA0065.jpg我只使用Android手机(Android 6.1),但每次都得到“C:\fakepath…”。如果我理解正确,我需要将“fileToCopy.txt”替换为“$('.file').val()”,对吗?谢谢。是的,没错,如果我正确理解了您的问题,fileToCopy应该替换为$('.file').val(),CopiedFile应该替换为“arquivo”。我还有其他问题,无法工作,每次出现错误“err-fileSystem.getFile:{code:1}”,我都会像前面说的那样替换fileToCopy或此文件的路径($('.file').val())必须存储在android设备上,否则它将无法工作。错误代码1表示未找到错误,因此您的设备上不存在此文件。是的,您是对的。但是这个文件是在Android的本地存储中(存在于设备中),我只是添加了console.log来查看接收到的信息,我不知道为什么每次文件URI都显示为“C:\fakepath”(我使用的是Google Chrome Inspect)。你的解释帮助很大,但我还是无法从输入中获取文件。。。在日志中我得到这个。。。appURI=file:///storage/emulated/0/Android/data/br.com.johnhenrique.myapp/ 是输入文件中文件选择的正确URI:C:\fakepath\IMG-20170926-WA0065.jpg我只使用Android手机(Android 6.1),但每次都得到“C:\fakepath…”。如果我理解正确,我需要将“fileToCopy.txt”替换为“$('.file').val()”,对吗?谢谢。是的,没错,如果我正确理解了您的问题,fileToCopy应该替换为$('.file').val(),CopiedFile应该替换为“arquivo”。我还有其他问题,无法工作,每次出现错误“err-fileSystem.getFile:{code:1}”,我都会像前面说的那样替换fileToCopy或此文件的路径($('.file').val())必须存储在android设备上,否则它将无法工作。错误代码1表示未找到错误,因此您的设备上不存在此文件。是的,您是对的。但该文件位于Android的本地存储中(存在于设备中),我只是添加了console.log来查看接收到的信息,我不知道为什么每次文件URI都显示为“C:\fakepath”(我使用的是Google Chrome Inspect)。