如何从文件的URI获取base64?

时间:2019-09-03 10:38:24

标签: android base64 android-file

通常,我的任务是从所选文件中获取base64。为了打开文件浏览器,我调用以下函数:

private fun showFileBrowser() {
    val intent = Intent(Intent.ACTION_GET_CONTENT)
    intent.setType("*/*")
    startActivityForResult(intent, FILE_CHOOSE_REQUEST_CODE)
}

已成功打开。选择某个文件后,将调用onActivityResult。在这里:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == FILE_CHOOSE_REQUEST_CODE) {
        // not that data.data is Uri
        if(data != null && data.data != null) {
            val encodedBase64 = getBase64FromPath(data.data.path)
            print(encodedBase64)
        }


    }

}

这是我将File转换为base64的方式:

 private fun getBase64FromPath(path: String): String {

    try {
        val bytes = File(path).readBytes()

        return Base64.encodeToString(bytes, Base64.DEFAULT)
    } catch (error: IOException) {
        error.printStackTrace() // This exception always occurs 
    }

}

似乎我做对了所有事情,但得到了FileNotFoundException。我不知道是什么原因。我没有添加任何权限,因为我不想写任何东西,我只希望用户选择一个文件,然后将其转换为base64并将其发送到服务器。那么,这是我的代码有什么问题?

1 个答案:

答案 0 :(得分:1)

  

我的任务是从所选文件中获取base64

您的代码与文件无关。 ACTION_GET_CONTENT不仅限于设备上的文件,更不用说您可以访问的文件系统上的文件了。

  

选择某些文件后,将调用onActivityResult

您通过Uri得到了onActivityResult()Uri不是文件,getPath()上的Uri仅在该Uri的方案为file时才有意义。大多数Uri的值将采用content的方案。

替换您的功能:

private fun getBase64ForUriAndPossiblyCrash(uri: Uri): String {

    try {
        val bytes = contentResolver.openInputStream(uri).readBytes()

        return Base64.encodeToString(bytes, Base64.DEFAULT)
    } catch (error: IOException) {
        error.printStackTrace() // This exception always occurs 
    }

函数名称的AndPossiblyCrash部分是因为如果内容太大,将耗尽内存。另外请注意,您正在主应用程序线程上执行此工作,因此在阅读本指南时,您的UI将被冻结。