文件下载的时候,一致拿不到文件的总长度,返回 -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();
}