如何从文件 URI 获取 base64?
How to get base64 from file's URI?
一般来说,我的任务是从所选文件中获取 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 并发送到服务器。那么,我的代码有什么问题?
my task is to get base64 from chosen file
您的代码与文件关系不大。 ACTION_GET_CONTENT
不限于设备上的文件,更不用说您可以访问的文件系统上的文件了。
When some file is chosen, onActivityResult is called
您通过 onActivityResult()
获得 Uri
。 Uri
不是文件,Uri
上的 getPath()
只有在 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 将被冻结。
一般来说,我的任务是从所选文件中获取 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 并发送到服务器。那么,我的代码有什么问题?
my task is to get base64 from chosen file
您的代码与文件关系不大。 ACTION_GET_CONTENT
不限于设备上的文件,更不用说您可以访问的文件系统上的文件了。
When some file is chosen, onActivityResult is called
您通过 onActivityResult()
获得 Uri
。 Uri
不是文件,Uri
上的 getPath()
只有在 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 将被冻结。