- 前言
现项目需要写个方法下载url文件到指定路径,这里需要特别注意,要处理url中含中文和空格的情况,不然会有400错误。如http://192.168.0.22:8203/system/statics/answer/答案 附件.zip,其中包含空格、中文。 - 代码
public static void downLoadByUrl(String urlStr,String savePath) {
try {
// 编码处理空格、中文
String encodeUrl = URLEncoder.encode(urlStr, "utf-8").replaceAll("\\+", "%20");
// 由于整个url被编码,需要将冒号,斜杠进行还原
encodeUrl = encodeUrl.replaceAll("%3A", ":").replaceAll("%2F", "/");
String fileName = getFileName(urlStr);
URL url = new URL(encodeUrl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//设置超时间为5秒
conn.setConnectTimeout(5*1000);
//防止屏蔽程序抓取而返回403错误
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
//得到输入流
InputStream inputStream = conn.getInputStream();
//获取自己数组
byte[] getData = readInputStream(inputStream);
//文件保存位置
File saveDir = new File(savePath);
if(!saveDir.exists()){ // 没有就创建该文件
saveDir.mkdir();
}
File file = new File(saveDir+File.separator+fileName);
FileOutputStream fos = new FileOutputStream(file);
fos.write(getData);
fos.close();
inputStream.close();
System.out.println("the file: "+url+" download success");
}catch (Exception e){
e.printStackTrace();
}
}
public static byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[4*1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}
public static String getFileName(String srcRealPath){
return StringUtils.substringAfterLast(srcRealPath,"/");
}
至于将文件压缩成zip,可用hutools完成