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
相关产品推荐
相关产品推荐

