在 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 路径的方法都是不稳定的,并且有边缘情况,只会带来麻烦。