Retrofit 2 RequestBody内容长度大于文件大小

时间:2017-07-21 15:56:41

标签: android retrofit kotlin

我有一个Api,要求我在发送实际文件之前以字节为单位发送文件大小。当我在第一个Api呼叫中发送文件file.length()时,它会返回1996

然后,当我将文件打包到RequestBody时,contentLength()变为2556。然后服务器拒绝这个,说这些大小必须匹配。

以下是创建RequestBody

的代码
val requestBody = RequestBody.create(
                        MediaType.parse("image/jpeg"),
                        avatarFile)
  • RequestBody中添加了什么来增加其内容长度?
  • 我应该在第一次通话时发送RequestBody的大小来解决这个问题吗?

编辑

这是我第一次调用API时最初发送大小的地方:

return authService.updateAvatar(
                    AvatarMetadataRequest(
                            size = avatarFile.length().toInt(),
                            crc = profileImageProvider.getFile()!!.checksum()!!.toInt()))

然后这是我第二次实际上传文件时所称的地方:

        val avatarFile = profileImageProvider.getFile()

        val requestBody = RequestBody.create(
                MediaType.parse("image/jpeg"),
                avatarFile)
        return authService.uploadAvatar(
                id.split("/").last(),
                MultipartBody.Part.createFormData("avatar",
                        profileImageProvider.getFileName(),
                        requestBody))

事实证明contentLength()的{​​{1}}是正确的。因此,在调用requestBody时,必须修改或增加Content-Length

1 个答案:

答案 0 :(得分:0)

这似乎是头像上传API的一个错误。头像被上传为MultipartData,因此永远不会等于文件的原始大小。这是因为除了文件之外,多部分请求还会有其他数据。

以下是多部分请求示例:

--------------------------0b880724ca8aacd6
Content-Disposition: form-data; name="file1"; filename="test.txt"
Content-Type: text/plain

test test test

--------------------------0b880724ca8aacd6--

如您所见,该文件的内容仅为test test test。其他所有内容都是多部分请求添加的附加数据。

由于所有额外数据,磁盘上的原始大小为15个字节,而请求的Content-Length为202.

因此,头像上传API不应只是检查整个请求的内容长度,而是提取与文件相关的特定部分,只检查该部分中包含的数据的大小。

如果您无法控制头像上传API的行为,则可以通过计算多部分请求添加的开销的总大小并将其添加到文件大小来尝试计算总内容长度。