项目中加了个下载方法,获取的响应中的contentlength值总是-1,查看源码可以看到
用这个int类型的获取的当length大于Int的最大值(2147483647),就返回-1,我需要下载的文件确实大于这个值了,
查看源码还有别的获取length的方法,最后使用了getContentLengthLong方法解决了这个问题
下载代码
package com.axwlj.springboot.base.util;
import com.axwlj.springboot.sys.result.Result;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.NumberFormat;
import java.util.Date;
import java.util.HashMap;
/**
* Sen
* 2021/3/2316:13
**/
@Slf4j
public class DownloadUtil {
public static Result download(String httpUrl, String method, HashMap<String,String> headerMap, String path){
BufferedInputStream bis =null;
BufferedOutputStream bos=null;
Result result = new Result();
try {
HttpURLConnection urlConnection = getConnection(httpUrl,method,headerMap);
long contentLength = urlConnection.getContentLengthLong();
log.info("文件的大小是:{}",contentLength);
if (contentLength>32) {
InputStream is= urlConnection.getInputStream();
bis = new BufferedInputStream(is);
FileOutputStream fos = new FileOutputStream(path);
bos= new BufferedOutputStream(fos);
int b;
byte[] byArr = new byte[1024];
long stime = System.currentTimeMillis();
log.info("开始写文件:{}",new Date());
while((b= bis.read(byArr))!=-1){
bos.write(byArr, 0, b);
}
}
log.info("地址是-----------------------:{}",path);
log.info("下载的文件的大小是------------:{}",contentLength);
result.setCode(1);
}else {
result.setCode(0);
result.setMessage(urlConnection.getResponseMessage());
}
} catch (Exception e) {
e.printStackTrace();
result.setCode(0);
result.setMessage(e.getMessage());
}finally{
try {
if(bis !=null){
bis.close();
}
if(bos !=null){
bos.close();
}
} catch (IOException e) {
result.setMessage(e.getMessage());
e.printStackTrace();
}
}
return result;
}
public static HttpURLConnection getConnection(String httpUrl, String method, HashMap<String,String> headerMap) throws Exception {
URL url = new URL(httpUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(method);
if (!headerMap.isEmpty()){
headerMap.keySet().forEach(x->{
String o = headerMap.get(x);
connection.setRequestProperty(x, o);
});
}
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setConnectTimeout(1000*3600*5);
connection.setRequestProperty("Connection", "Keep-Alive");
connection.connect();
return connection;
}
}