科尔多瓦:如何将文件移到“下载”文件夹?

Fra*_*ssi 2 android cordova cordova-plugins vue.js quasar-framework

情况:

在我的移动应用程序中,我需要下载一个文件并将其存储在“下载”文件夹中。

下载部分工作正常。该文件已从服务器正确下载并存储在以下文件夹中:

file:///storage/emulated/0/Android/data/org.cordova.MY_APP_NAME.app/my_file.pdf
Run Code Online (Sandbox Code Playgroud)

但是该位置并不是真正的用户友好型。

要访问它,我必须转到:内部存储/ Android /数据/ org.cordova.MY_APP_NAME.app /

因此,我需要将其移至主下载文件夹。

文件传输是我无法完成的。

我知道关于SO已经有几个类似的问题。

我已经尝试了所有方法,但对我来说真的没有用,我无法在实际的Download文件夹中看到该文件。

项目信息:

我使用的类星体Vuejs科尔多瓦

平台

目前,我正在使用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'
    }
  }
)
Run Code Online (Sandbox Code Playgroud)

文件传输代码:

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)
}
Run Code Online (Sandbox Code Playgroud)

问题:

如何将文件移到“下载”文件夹?

谢谢

编辑:

这是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
Run Code Online (Sandbox Code Playgroud)

Fra*_*ssi 5

好吧,我设法解决了。

  • 首先,完全没有必要下载然后移动文件。可以直接按所需方向下载它。

  • 正确的路径(以我为例)是:

    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)
}
Run Code Online (Sandbox Code Playgroud)

结果很可能是false。这意味着我们必须请求用户许可:

permissions.requestPermission(successCallback, errorCallback, permission)
Run Code Online (Sandbox Code Playgroud)

这样,它将显示警报以请求许可。

代码:

综上所述,这是工作代码:

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
  )
}
Run Code Online (Sandbox Code Playgroud)