【问题标题】:Uploading remote URI's using retrofit/okhttp stack on Android在 Android 上使用 retrofit/okhttp 堆栈上传远程 URI
【发布时间】:2017-04-18 20:51:47
【问题描述】:

亲爱的堆栈溢出, Android 上 URI 的概念很棒,它抽象了我们如何指向设备和互联网上的不同事物,但它确实需要仔细考虑才能使用它们。我有几个问题要问你。

1) 人们通常如何使用远程 URI 上传到自己的服务器? 我能想到的最好的方法是,将远程 URI 下载到磁盘,并将指向该文件的指针指向 okhttp。 这是最好的方法吗?

2) 其次是关于本地 URI 的更基本的问题。 URI 可以指向不同的东西,并且文件的绝对路径存储在不同的位置以供各种提供者使用。请参阅this link 中的#getPath。

由于 okhttp 仅适用于绝对文件,因此该文件中存在此逻辑是否是通过 okhttp 发送文件的最佳方式。

或者你有什么更好的建议吗?

假设为简单起见,我们正在为 Kitkat 及更高版本进行开发。

【问题讨论】:

    标签: android android-contentprovider retrofit2 android-file okhttp3


    【解决方案1】:

    1) 是的。最好的方法是保证您在上传完成之前可以访问它(特别是如果您有恢复功能,上传可能会中断并稍后重新开始),是在本地保存一份副本您自己的应用程序。 URI 可能会在以后消失或不可用。

    2) 是的。请参阅 1) 使用文件,它们是具体且可靠的。

    编辑:

    根据您的 cmets,我意识到我的答案没有得到很好的解释。 我所说的“使用文件”是指使用context.getContentResolver().openInputStream(uri) 将文件本地保存到您自己的应用程序中,使用context.openFileOutput("temp_file", 0)context.getFilesDir(),然后您就可以安全地使用该文件了。

    FileUtils 上所有那些试图猜测 URI 路径的方法都是不稳定的,并且有边缘情况,只会带来麻烦。

    【讨论】:

    • 文件是具体且可靠的。但问题是 URI 并没有始终如一地公开绝对文件路径。试图找到绝对文件路径与最初开发 URI 的原因完全相反。我使用 FileUtils.getPath 作为来自 Google Drive 应用程序的内容 URI,该函数返回 null。假设我找出路径是什么......明天如果其他一些应用程序为文件路径提供不同的位置..我们是否必须继续添加新代码才能获取路径?如何使用:
    • 请看我的编辑。我的回答没有得到很好的解释。
    • 感谢您的澄清。我同意。看起来目前这是最好的方法。但它导致的低效率并不是我的忠实粉丝。试想一个 100MB 的文件,需要复制,只是为了上传文件。会接受你的回答。
    • 如果 Retrofit 可以采用 InputStream 来代替会很有趣,但是没有这个选项......我们无能为力
    猜你喜欢
    • 2020-12-31
    • 2020-05-31
    • 1970-01-01
    • 2016-04-24
    • 2015-09-10
    • 1970-01-01
    • 2021-01-19
    • 2017-06-14
    • 1970-01-01
    相关资源
    最近更新 更多