You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin:如何用Retrofit上传400MB大视频?现有代码存缺陷

解决方案

1. 修复小视频上传后损坏的问题

现有代码创建RequestBody时未指定正确的MIME类型,服务器无法识别文件格式,导致下载后视频损坏。需明确指定视频对应的MIME类型:

修改上传触发代码:

private fun uploadVideo(file: File) {
    viewModelScope.launch(Dispatchers.IO) { // 改用viewModelScope避免内存泄漏
        val mediaType = "video/mp4".toMediaTypeOrNull()
        val requestBody = file.asRequestBody(mediaType)
        // 需确保"file"与服务器接收的参数名一致
        val filePart = MultipartBody.Part.createFormData("file", file.name, requestBody)
        uploadViewModel.uploadVideo("assam-storage-zone", "Folder1", "myFileName.mp4", filePart)
    }
}

2. 支持400MB级大视频上传

直接上传大文件会导致内存溢出,默认RequestBody会把整个文件加载到内存。需采用流式上传,同时调整Retrofit超时时间适配长传文件需求:

2.1 实现流式RequestBody

自定义RequestBody以流的方式读取文件,避免占用过多内存:

class StreamingFileRequestBody(
    private val file: File,
    private val mediaType: MediaType?
) : RequestBody() {
    override fun contentType(): MediaType? = mediaType

    override fun writeTo(sink: BufferedSink) {
        file.inputStream().use { inputStream ->
            sink.writeAll(inputStream.source())
        }
    }

    override fun contentLength(): Long = file.length()
}

2.2 修改上传代码使用流式RequestBody

private fun uploadVideo(file: File) {
    viewModelScope.launch(Dispatchers.IO) {
        val mediaType = "video/mp4".toMediaTypeOrNull()
        val requestBody = StreamingFileRequestBody(file, mediaType)
        val filePart = MultipartBody.Part.createFormData("file", file.name, requestBody)
        uploadViewModel.uploadVideo("assam-storage-zone", "Folder1", "myFileName.mp4", filePart)
    }
}

2.3 调整Retrofit超时时间

大文件上传耗时久,默认超时会导致上传中断,构建Retrofit时设置更长的超时:

val okHttpClient = OkHttpClient.Builder()
    .connectTimeout(5, TimeUnit.MINUTES)
    .readTimeout(5, TimeUnit.MINUTES)
    .writeTimeout(5, TimeUnit.MINUTES) // 重点配置写超时,对应上传操作
    .build()

val retrofit = Retrofit.Builder()
    .baseUrl("你的服务器基础URL")
    .client(okHttpClient)
    .addConverterFactory(GsonConverterFactory.create())
    .build()

3. 额外注意事项

  • 确认服务器端配置支持大文件上传,例如Nginx需调整client_max_body_size,后端框架需修改文件上传大小限制参数。
  • ViewModel保持原有逻辑即可,无需额外修改,调用时务必使用viewModelScope而非自定义协程作用域,避免内存泄漏。
  • 若需监听上传进度,可在StreamingFileRequestBody的writeTo方法中添加进度回调逻辑,实时推送上传进度。

内容的提问来源于stack exchange,提问作者Get Success

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:19:53