responseBody.contentLength(); = -1

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

private OkHttpClient getOkHttpClient(Cache cache) {
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(new Interceptor() {
                    @Override
                    public okhttp3.Response intercept(Chain chain) throws IOException {
                        Request original = chain.request();
                        // Customize the request
                        Request request = original.newBuilder()
                                .addHeader("Accept-Encoding", "identity")
                                .build();
                        okhttp3.Response response = chain.proceed(request);
                        response.cacheResponse();
                        return response;
                    }
                })
                .addInterceptor(getHttpLoggingInterceptor())
                .addInterceptor(new ProgressInterceptor())//替换ResponseBody为ProgressResponseBody
                .cache(cache)
                .build();

        return okHttpClient;
    }

但是依然没有用,突然想到后台是自己搭建的,在返回数据的时候没有设置Content-Length属性,添加代码:response.addHeader(“Content-Length”, String.valueOf(fis.available()));

于是修改后台代码

File file = new File(filePath + "/" + filename);
        if (file.exists()) {
            try (FileInputStream fis = new FileInputStream(file);
                 BufferedInputStream bis = new BufferedInputStream(fis)) {
                response.setContentType("application/octet-stream");
                response.addHeader("Content-Length", String.valueOf(fis.available()));
                response.setHeader("content-type", "application/octet-stream");
                response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(filename, "utf8"));
                byte[] buffer = new byte[1024];
                //输出流
                OutputStream os = response.getOutputStream();
                int i = bis.read(buffer);
                while (i != -1) {
                    os.write(buffer);
                    i = bis.read(buffer);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值