Postman转Retrofit2实现AWS MP4视频上传格式异常问题求助
问题分析与解决方案
看起来你踩了一个Retrofit上传的常见误区——用Multipart方式上传到AWS预签名PUT URL,但这类URL其实需要直接上传原始二进制文件,而非多部分表单数据。
你在Postman里应该是选择了「binary」模式直接上传MP4文件,而非form-data格式,所以能成功;但你的Retrofit代码用了MultipartBody,这会把视频文件包装在表单边界和额外的HTTP头里,导致AWS收到的不是纯MP4二进制数据,自然会被Elastic Transcoder判定为无法解析的媒体文件。
修正步骤:
1. 修改Retrofit接口定义
去掉@Multipart注解,直接用@Body传递原始请求体:
@PUT fun uploadVideo( @Header("Content-Type") contentType: String, @Url url: String, @Body requestBody: RequestBody ): Call<ResponseBody>
2. 构建正确的请求体
不需要用MultipartBody.Builder,直接将文件转为RequestBody即可:
// 确保MediaType正确设置为video/mp4 val mediaType = MediaType.parse("video/mp4") ?: error("Invalid media type") val requestBody = videoFile.asRequestBody(mediaType)
3. 调用接口上传
直接传递构造好的请求体发起上传:
yourApiService.uploadVideo("video/mp4", yourAwsPresignedUrl, requestBody) .enqueue(object : Callback<ResponseBody> { override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) { if (response.isSuccessful) { // 处理上传成功逻辑 } else { // 处理服务器错误 } } override fun onFailure(call: Call<ResponseBody>, t: Throwable) { // 处理网络请求失败 } })
关键说明:
- AWS的预签名PUT URL(比如S3预签名URL)设计目的是接收原始文件二进制流,而非Multipart表单;Multipart会给文件内容添加额外的分隔符和表单元数据,破坏MP4的文件结构
- 确保
Content-Type头和请求体的MediaType完全一致,且匹配文件实际格式(这里是video/mp4) - 你之前收到200响应是因为AWS成功接收了Multipart格式的数据,但后续处理时无法识别被包装的MP4内容,因此在Elastic Transcoder中出现报错
内容的提问来源于stack exchange,提问作者Amit Bhandari
相关产品推荐
相关产品推荐

