如何使用 Retrofit2 发送带有图像的多部分?

问题描述 投票:0回答:3

我需要从下图中发送相同的数据(

Postman
)

我正在使用

Retrofit
Coroutines
,我尝试使用以下代码片段发送请求:

@POST("ia")
@Multipart
suspend fun getMeasurement(
    @HeaderMap authenticationHeaders: ApiHeaders,
    @Part("userId") userId: RequestBody,
    @Part("sessionId") sessionId: RequestBody,
    @Part file: MultipartBody.Part,
    @Part file2: MultipartBody.Part,
    @Part file3: MultipartBody.Part,
    @Part file4: MultipartBody.Part,
): Response<MeasurementResponse>

创造

MultipartBody.Part

fun createImageRequestBody(imageUri: Uri, fileName: String): MultipartBody.Part? {
        context.contentResolver?.query(imageUri, null, null, null, null)?.use {
            if (it.moveToFirst()) {
                val picturePath =
                    it.getString(it.getColumnIndex(MediaStore.MediaColumns.DATA))

                val requestBody = File(picturePath).asRequestBody("image/jpeg".toMediaTypeOrNull())
                return MultipartBody.Part.createFormData(
                    "file",
                    "${fileName}.jpeg",
                    requestBody
                )
            }
        }
        return null
    }

创建其他参数

val userId = user.id.toRequestBody("text/plain".toMediaTypeOrNull())

val sessionId = session.id.toRequestBody("text/plain".toMediaTypeOrNull())

我不知道为什么这会导致服务器出现错误 413(实体太大),当我通过

Postman
尝试时它工作正常。我做错了什么?

android retrofit multipartform-data
3个回答
1
投票

HTTP 413 错误响应代码表示服务器拒绝请求,因为负载太大。在这种情况下,服务器可能会拒绝请求,因为请求中上传的所有文件的总大小太大了。

要解决此问题,您可以尝试减小正在上传的文件的大小或增加服务器的最大上传大小限制。

此外,您还可以通过在 createImageRequestBody 函数中添加日志语句来检查每个上传文件的大小。例如,您可以在返回 MultipartBody.Part 之前添加以下行:

Log.d("TAG", "File size: ${File(picturePath).length()}");

这将记录每个上传到控制台的文件的大小,使您能够验证文件没有超过允许的最大大小。

编辑:

我刚读了你的评论,你提到你在发送小文件时仍然会收到问题,有时不会收到大文件的问题。

如果您在发送小图像(大约 10kb)时遇到 413 错误,则问题可能与有效负载的大小无关,而是与您构建多部分请求的方式有关。


0
投票

检查服务器允许的最大负载大小并确保因为在您的情况下,服务器可能拒绝请求,因为您上传的四个文件的总大小太大。

关于 Postman Postman 可能会自动压缩或分块请求负载,这就是为什么它在 Postman 中有效但在 Retrofit 代码中无效的原因。您可以尝试使用 Postman 的“代码”功能为您的请求生成代码片段,看看它生成的代码是否与您当前使用的不同。

尝试使用不同的文件,例如 1kb 的小文本文件。


0
投票

只是去掉参数中的HeaderMap就解决了问题,但不知道为什么。

© www.soinside.com 2019 - 2024. All rights reserved.