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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:37:52