情况:
在我的移动应用中,我需要下载文件并存储在“下载”文件夹中。
下载部分工作正常。 该文件已从服务器正确下载并存储在以下文件夹中:
file:///storage/emulated/0/Android/data/org.cordova.MY_APP_NAME.app/my_file.pdf
但该位置并非真正用户友好。
要访问它,我必须转到:内部存储/ Android / data / org.cordova.MY_APP_NAME.app /
所以我需要将它移动到主要的下载文件夹。
文件传输是我无法做到的。
我知道在SO上已经有几个类似的问题。
我已经尝试了所有这些,但没有一个对我有效,我永远无法在实际的下载文件夹中看到该文件。
项目信息:
PLATFORM :
目前我正在使用Android。但理想情况下,我正在寻找适用于Android和IOS的解决方案。
代码:
下载代码:
var fileTransfer = new FileTransfer() // eslint-disable-line
var uri = encodeURI('https://MY_SERVER_PATH')
fileTransfer.download(
uri,
cordova.file.externalApplicationStorageDirectory + 'my_file.pdf',
entry => {
console.log('download complete: ' + entry.toURL())
this.moveFile(entry.toURL())
},
error => {
console.log('download error source ' + error.source)
console.log('download error target ' + error.target)
console.log('download error code' + error.code)
},
false,
{
headers: {
'Authorization': 'Basic asdasdasdasdassdasdasd'
}
}
)
文件传输代码:
moveFile(fileUri) {
window.resolveLocalFileSystemURL(
fileUri,
fileEntry => {
let newFileUri = 'file:///storage/emulated/0/Download'
window.resolveLocalFileSystemURL(
newFileUri,
dirEntry => {
fileEntry.moveTo(dirEntry, 'new_filename.pdf', this.moveFileSuccess, this.moveFileError)
},
this.moveFileError)
},
this.moveFileError)
},
moveFileSuccess(entry) {
console.log('file move success')
console.log(entry)
},
moveFileError(error) {
console.log('file move error')
console.log(error)
}
问题:
如何将文件移动到“下载”文件夹?
由于
修改
这是cordova.file
对象的控制台日志:
applicationDirectory: "file:///android_asset/"
applicationStorageDirectory: "file:///data/user/0/org.cordova.MY_APP_NAME.app/"
cacheDirectory:"file:///data/user/0/org.cordova.MY_APP_NAME.app/cache/"
dataDirectory: "file:///data/user/0/org.cordova.MY_APP_NAME.app/files/"
documentsDirectory: null
externalApplicationStorageDirectory: "file:///storage/emulated/0/Android/data/org.cordova.MY_APP_NAME.app/"
externalCacheDirectory: "file:///storage/emulated/0/Android/data/org.cordova.MY_APP_NAME.app/cache/"
externalDataDirectory: "file:///storage/emulated/0/Android/data/org.cordova.MY_APP_NAME.app/files/"
externalRootDirectory: "file:///storage/emulated/0/"
sharedDirectory: null
syncedDataDirectory: null
tempDirectory: null
答案 0 :(得分:3)
好的,我设法解决了。
首先完全没必要下载然后移动文件。它可以直接下载到所需的方向。
正确的路径(在我的情况下)是这样的:
cordova.file.externalRootDirectory + 'download/' + 'my_file.pdf
对应于:file:///storage/emulated/0/download/my_file.pdf
这意味着要查找设备内的文件,您必须转到:内部存储/下载/ my_file.pdf
在config.xml中添加以下值:
<preference name="AndroidPersistentFileLocation" value="Compatibility" />
<preference name="AndroidExtraFilesystems" value="files,files-external,documents,sdcard,root" />
使用此cordova插件检查权限非常重要:cordova-plugin-android-permissions
您可以像这样进行快速测试:
let permissions = cordova.plugins.permissions
permissions.checkPermission(permissions.READ_EXTERNAL_STORAGE, checkPermissionCallback, null)
function checkPermissionCallback(status) {
console.log('checking permissions')
console.log(status)
}
最有可能的结果是false
。这意味着我们必须向用户请求权限:
permissions.requestPermission(successCallback, errorCallback, permission)
通过这种方式,它会出现要求许可的警报。
代码:
总而言之,这是工作代码:
let pdfPath = 'https://MY_SERVER_PATH'
let permissions = cordova.plugins.permissions
permissions.checkPermission(permissions.READ_EXTERNAL_STORAGE, checkPermissionCallback, null)
// Checking for permissions
function checkPermissionCallback(status) {
console.log('checking permissions')
console.log(status)
if (!status.hasPermission) {
var errorCallback = function () {
console.warn('Storage permission is not turned on')
}
// Asking permission to the user
permissions.requestPermission(
permissions.READ_EXTERNAL_STORAGE,
function (status) {
if (!status.hasPermission) {
errorCallback()
} else {
// proceed with downloading
downloadFile()
}
},
errorCallback)
} else {
downloadFile()
}
}
function downloadFile() {
let filePath = cordova.file.externalRootDirectory + 'download/' + 'my_file.pdf'
let fileTransfer = new window.FileTransfer()
let uri = encodeURI(decodeURIComponent(pdfPath))
// Downloading the file
fileTransfer.download(uri, filePath,
function (entry) {
console.log('Successfully downloaded file, full path is ' + entry.fullPath)
console.log(entry)
},
function (error) {
console.log('error')
console.log(error)
},
false
)
}
答案 1 :(得分:0)
var fileTransfer = new FileTransfer() // eslint-disable-line
var uri = encodeURI('https://MY_SERVER_PATH')
var fileURL = "///storage/emulated/0/Download";
fileTransfer.download(
uri,
fileURL+ 'your_file.pdf',
entry => {
console.log('download complete: ' + entry.toURL())
this.moveFile(entry.toURL())
},
error => {
console.log('download error source ' + error.source)
console.log('download error target ' + error.target)
console.log('download error code' + error.code)
},
false,
{
headers: {
'Authorization': 'Basic asdasdasdasdassdasdasd'
}
}
)
您可以直接将下载的文件保存到路径
尝试上面的代码,让我知道它的工作原理。
答案 2 :(得分:-1)
cordova.file.externalApplicationStorageDirectory.
对于该路径,您无需在清单中请求任何权限或根本不需要任何权限。
但是对于其他人来说,比如外部存储,所以你需要它们。
今年你遇到这个问题#1244。
Google获取运行时权限。
您可以直接下载到下载目录。