【问题标题】:Cordova: How to move file to the Download folder?Cordova:如何将文件移动到下载文件夹?
【发布时间】:2018-04-06 09:17:05
【问题描述】:

情况:

在我的移动应用中,我需要下载一个文件并存储在下载文件夹中。

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

file:///storage/emulated/0/Android/data/org.cordova.MY_APP_NAME.app/my_file.pdf

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

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

所以我需要将它移动到主下载文件夹。

文件传输是我做不到的。

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

我已经尝试了所有方法,但没有一个真正适合我,我永远无法在实际的下载文件夹中看到该文件。

项目信息:

我将QuasarVuejsCordova 一起使用。

平台

目前我正在使用 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

【问题讨论】:

  • 文件传输代码有什么问题?当然,您应该报告所有错误和异常。你现在让我们猜猜。
  • cordova.file.externalApplicationStorageDirectory。只需尝试不同的目录。用于下载的那个/
  • 你是对的。它给出了错误代码 1。我一直在尝试其他位置,但它给出了同样的错误,或者它只是没有保存它。下载文件夹的确切路径应该是什么?
  • 不要放置硬编码路径(当然,你可以在设备上的文件资源管理器应用程序中找到硬编码路径,所以你问为什么?但如前所述,不要使用cordova.file.externalApplicationStorageDirectory. Just try a different directory.
  • externalRootDirectory: "file:///storage/emulated/0/" 你应该使用的那个。并且下载目录的完整路径是/storage/emulated/0/Download。不要告诉我们它还没有。

标签: android cordova vue.js cordova-plugins quasar-framework


【解决方案1】:

好的,我设法解决了。

  • 首先完全没有必要下载然后移动文件。直接下载到想要的方向就好了。

  • 正确的路径(在我的例子中)是这样的:

    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
  )
}

【讨论】:

  • “下载”是否区分大小写,在我的设备中是“下载”(大写 D)?
  • @FrancescoMussi。请您看看这个问题并提供帮助,因为我不确定我应该将您编写的代码放在哪里? stackoverflow.com/questions/69312863/…
【解决方案2】:
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'
      }
    }
 )

您可以直接将下载的文件保存到您的路径

试试上面的代码,让我知道它是否有效。

【讨论】:

  • 这样下载失败,错误码1
  • 你能分享你的服务器路径吗
  • + 'my_file.pdf'
  • fileTransfer.download( uri, fileURL+ 'my_file.pdf', entry => 像这个兄弟一样试试
  • In this way the download fails with the error code 1 嗯....1 是什么意思?我们应该知道吗?
【解决方案3】:
 cordova.file.externalApplicationStorageDirectory. 

对于该路径,您不需要在清单中请求任何权限或根本不需要任何权限。

但是对于其他人来说,比如外部存储,所以你需要它们。

今年你在这个问题上排名第 1244。

Google 获取运行时权限。

你可以直接下载到Download目录下。

【讨论】:

  • 我知道有很多类似的问题。如果没有提供实际答案,还会有更多...如果您可以粘贴一些工作代码,我们都可以关闭:)
  • 顺便说一句,我已经编辑了添加cordova.file对象的console.log的问题,其中包括文件位置,但似乎没有下载文件夹..
  • I know there are many similar question. 对于 Xamarin,我不知道。但问题是众所周知的。现在你谷歌了吗?你什么都没有确认或否认。
  • but it doesn't seem to be there the Download folder. 不如创建它。问题是什么?你说你想转移到那个文件夹。那么发生了什么?很不清楚。
  • 请将文件位置以文本形式发布。我想复制/粘贴一个,但你让它不可能。我应该输入还是什么?
猜你喜欢
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 2014-02-13
  • 2019-02-20
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多