在 Android 上使用 retrofit/okhttp 堆栈上传远程 URI
Uploading remote URI's using retrofit/okhttp stack on Android
亲爱的堆栈溢出,
Android 上的 URI 的概念很棒,它抽象出我们如何指向设备和互联网上的不同事物,但它确实需要仔细考虑才能与它们一起使用。我有几个问题要问你。
1) 人们通常如何使用远程 URI 上传到他们自己的服务器?
我能想到的最好的方法是,将远程 URI 下载到磁盘,并将指向该文件的指针提供给 okhttp。
这是最好的方法吗?
2) 第二个是关于本地 URI 的更基本的问题。 URI 可以指向不同的东西,并且文件的绝对路径存储在各种提供程序的不同位置。请参阅 this link 中的#getPath。
由于 okhttp 仅适用于绝对文件,因此该文件中存在的这种逻辑是否是通过 okhttp 发送文件的最佳方式。
或者您有更好的建议吗?
让我们假设,为了简单起见,我们正在为 Kitkat 及更高版本开发。
1) 是的。最好的方法是保证您在上传完成之前可以访问它(特别是例如,如果您有恢复功能,上传可能会中断并稍后重新开始),就是在本地复制一份你自己的应用程序。 URI 以后可能会消失或不可用。
2) 是的。看1)使用文件,它们是具体可靠的。
编辑:
根据您的评论,我意识到我的回答没有得到很好的解释。
"use a file" 的意思是使用 context.getContentResolver().openInputStream(uri)
使用 context.openFileOutput("temp_file", 0)
或 context.getFilesDir()
将文件本地保存到您自己的应用程序,然后您可以安全地使用该文件。
FileUtils 上所有那些尝试猜测 URI 路径的方法都是不稳定的,并且有边缘情况,只会带来麻烦。
亲爱的堆栈溢出, Android 上的 URI 的概念很棒,它抽象出我们如何指向设备和互联网上的不同事物,但它确实需要仔细考虑才能与它们一起使用。我有几个问题要问你。
1) 人们通常如何使用远程 URI 上传到他们自己的服务器? 我能想到的最好的方法是,将远程 URI 下载到磁盘,并将指向该文件的指针提供给 okhttp。 这是最好的方法吗?
2) 第二个是关于本地 URI 的更基本的问题。 URI 可以指向不同的东西,并且文件的绝对路径存储在各种提供程序的不同位置。请参阅 this link 中的#getPath。
由于 okhttp 仅适用于绝对文件,因此该文件中存在的这种逻辑是否是通过 okhttp 发送文件的最佳方式。
或者您有更好的建议吗?
让我们假设,为了简单起见,我们正在为 Kitkat 及更高版本开发。
1) 是的。最好的方法是保证您在上传完成之前可以访问它(特别是例如,如果您有恢复功能,上传可能会中断并稍后重新开始),就是在本地复制一份你自己的应用程序。 URI 以后可能会消失或不可用。
2) 是的。看1)使用文件,它们是具体可靠的。
编辑:
根据您的评论,我意识到我的回答没有得到很好的解释。
"use a file" 的意思是使用 context.getContentResolver().openInputStream(uri)
使用 context.openFileOutput("temp_file", 0)
或 context.getFilesDir()
将文件本地保存到您自己的应用程序,然后您可以安全地使用该文件。
FileUtils 上所有那些尝试猜测 URI 路径的方法都是不稳定的,并且有边缘情况,只会带来麻烦。