Android PhoneGap-尝试将文件复制到dataDirectory时出现错误代码5,但原因是什么?
在我的应用程序中,用户可以从图库中选择图像,此图像将用于“用户详细信息”。因此,创建了一个屏幕,其中存在一个名为“file”的输入文件。我需要将选择的映像复制到externalDataDirectory 我的问题是如何从文件choosen获取URI以进行复制 我的代码是。。。但每次都会得到错误代码9,但我不知道这是什么意思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
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)。