如何用Retrofit实现Postman式二进制音频文件上传?
解决Retrofit二进制音频上传问题
你之前用的@Multipart是多部分表单上传方式,而Postman的二进制上传是直接将文件内容作为请求体发送,两者格式不匹配,所以无法正常工作。按照以下步骤修改即可:
1. 修改Retrofit接口定义
移除@Multipart注解,改用@Body接收纯二进制请求体:
@POST("upload") fun uploadAudio( @Body requestBody: RequestBody ): Call<ModelGetAudioUrl>
2. 构建二进制请求体
将音频文件转换为RequestBody,注意指定匹配音频格式的MediaType(比如MP3用audio/mpeg,WAV用audio/wav,根据你的实际文件格式调整):
// 替换为你的音频文件路径 val audioFile = File("/storage/emulated/0/your_audio.mp3") // 匹配文件的MediaType,这里以MP3为例 val mediaType = MediaType.parse("audio/mpeg") val requestBody = RequestBody.create(mediaType, audioFile)
3. 发起上传请求
调用修改后的接口完成上传:
val apiService = retrofit.create(YourApiInterface::class.java) val call = apiService.uploadAudio(requestBody) call.enqueue(object : Callback<ModelGetAudioUrl> { override fun onResponse(call: Call<ModelGetAudioUrl>, response: Response<ModelGetAudioUrl>) { if (response.isSuccessful) { // 上传成功,处理返回的ModelGetAudioUrl } else { // 处理错误响应 } } override fun onFailure(call: Call<ModelGetAudioUrl>, t: Throwable) { // 处理网络或请求失败 } })
关键注意事项
- MediaType必须匹配:如果服务器对音频类型有要求,一定要使用对应格式的MediaType,否则服务器可能无法识别上传的内容。
- 无需设置额外的表单字段:二进制上传是直接把文件内容作为请求体,不需要像Multipart那样指定
audio_file这类字段名。
内容的提问来源于stack exchange,提问作者Pooya Jannati Poor
相关产品推荐
相关产品推荐

