【问题标题】:Retrofit 2 RequestBody Content Length Greater Than File SizeRetrofit 2 RequestBody 内容长度大于文件大小
【发布时间】:2017-12-27 18:16:17
【问题描述】:

我有一个 Api,它要求我先发送文件的大小(以字节为单位),然后再发送实际文件。当我在文件上调用file.length() 以在第一个Api 调用中发送时,它返回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))

事实证明requestBodycontentLength() 是正确的。因此,Content-Length 必须在调用 MultipartBody.Part.createFormData 时被修改或增加。

【问题讨论】:

  • OkHttpRequestBody.contentLength() 只是 forwards to file.length() 在引擎盖下,所以我很困惑这怎么会发生。
  • 如果您可以添加更多代码(例如,您调用 API 以发送文件大小的部分),它可能会有所帮助。
  • @PixelElephant 你是对的。 ResponseBody 不是问题。它正在其他地方添加它

标签: android retrofit kotlin


【解决方案1】:

这似乎是头像上传 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 不应该只是检查整个请求的 Content-Length,而是提取与文件相关的特定部分并检查该部分中包含的数据的大小。

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

【讨论】:

  • 有道理。感谢您的详细回答。有没有另一种方法可以通过改造 2 发送二进制文件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2013-08-09
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
相关资源
最近更新 更多