OKhttp response.body().contentLength()为-1

参考:okhttp response.body().contentLength()=-1
responseBody.contentLength(); = -1

1、文件下载的时候,一致拿不到文件的总长度,返回 -1。
服务器对下发的资源做GZip操作,而此时就没有相应的content-length,在网络请求的时候在Header中加入:Request.Builder().addHeader(“Accept-Encoding”, “identity”)
这样强迫服务器不走压缩。

2、倘若返回数据的时候没有设置Content-Length属性,添加代码:response.addHeader(“Content-Length”, String.valueOf(fis.available()));

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,对于这个问题,我可以给出以下的代码示例: ```java private void uploadFileWithProgress(String url, File file, final MediaType mediaType, final ProgressListener progressListener) { OkHttpClient client = new OkHttpClient.Builder() .addNetworkInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); Request.Builder requestBuilder = originalRequest.newBuilder() .method(originalRequest.method(), new ProgressRequestBody(originalRequest.body(), progressListener)); return chain.proceed(requestBuilder.build()); } }) .build(); RequestBody requestBody = RequestBody.create(mediaType, file); Request request = new Request.Builder() .url(url) .post(requestBody) .build(); try { Response response = client.newCall(request).execute(); // 处理响应结果 } catch (IOException e) { e.printStackTrace(); } } ``` 其中,`ProgressRequestBody` 是一个自定义的 `RequestBody`,用于在上传文件时监听上传进度。它的代码实现如下: ```java public class ProgressRequestBody extends RequestBody { private RequestBody requestBody; private ProgressListener progressListener; private CountingSink countingSink; public ProgressRequestBody(RequestBody requestBody, ProgressListener progressListener) { this.requestBody = requestBody; this.progressListener = progressListener; } @Override public MediaType contentType() { return requestBody.contentType(); } @Override public long contentLength() { try { return requestBody.contentLength(); } catch (IOException e) { e.printStackTrace(); } return -1; } @Override public void writeTo(BufferedSink sink) throws IOException { countingSink = new CountingSink(sink); BufferedSink bufferedSink = Okio.buffer(countingSink); requestBody.writeTo(bufferedSink); bufferedSink.flush(); } private final class CountingSink extends ForwardingSink { private long totalBytesWritten = 0L; public CountingSink(Sink delegate) { super(delegate); } @Override public void write(Buffer source, long byteCount) throws IOException { super.write(source, byteCount); totalBytesWritten += byteCount; progressListener.onProgress(totalBytesWritten, contentLength()); } } } ``` 然后,在调用 `uploadFileWithProgress` 方法时,只需要传入文件、媒体类型、进度监听器等参数即可: ```java uploadFileWithProgress(url, file, MediaType.parse("image/png"), new ProgressListener() { @Override public void onProgress(long currentBytes, long contentLength) { // 更新进度条 } }); ``` 注意,这里的 `MediaType` 必须要正确指定,否则可能会导致上传失败。另外,由于上传文件是一个比较耗时的操作,建议在子线程中执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值