最近对附件文件下载代码进行了简易的优化
下面出现的HttpUtil、FileUtil、ZipUtil都是Hutool工具包里提供的工具类。
private final static String DOWNLOAD = "download";
// 附件下载
public void downloadFile(HttpServletRequest request,HttpServletResponse response){
// 创建临时目录 可加 uid 放并发操作
File file = new File(uid + DOWNLOAD);
if(!file.exists()){
file.mkdir();
}
// 创建多级目录
for(FileEntity item:fileList){
String filePath = uid + DOWNLOAD+"/"+item.getName()+"/"+item.getType();
File fileDri = new File(filePath);
if(!fileDri.exists()){
file.mkdirs();
}
File fileOut = HttpUtil.downloadFileFromUrl(item.getUrl(),fileDri);
// 重命名 + uid 防止重名
fileOut.renameTo();
}
File fileZip = ZipUtil.zip(file);
response.setContentType("application/zip");
response.setHeader("Content-Disposition","attachment;filename="+uuid+".zip");
ServletOutputStream outputStream = response.getOutputStream();
FileInputStream fis = new FileInputStream(zip);
byte[] bytes = new byte[1024];
while((len = fis.read(bytes)) != -1){
outputStream.write(bytes,0,len);
}
fis.close();
outputStream.close();
// 删除暂存目录
FileUtil.del(file);
}
上述从远程下载文件,并重命名的方法
HttpUtil.downloadFileFromUrl(item.getUrl(),fileDri) ;
fileOut.renameTo();
可以替换为下面的方法:
// 获取远程服务文件流
public void URLDownLoad(Strin linkUrl,String fileDir) throws IOException{
if(ObjectUtil.isEmpty(linkUrl)){
return;
}
URL url = new URL(linkUrl);
URLConnection conn = url.openConnection();
//设置超时间为3秒
conn.setConnectTimeout(3 * 1000);
//防止屏蔽程序抓取而返回403错误 模仿浏览器行为
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
//得到输入流
InputStream inputStream = conn.getInputStream();
//得到远程文件
String[] split = urlFile.split("\\.");
//文件重命名
String filePath = fileDir+"/"+IdWorker.get32UUID()+"."+split[split.length-1];
File file = new File(filePath);
file.createNewFile();
FileOutputStream outputStream = new FileOutputStream(file);
byte[] buffer = new byte[1024 * 5];
int len;
while((len = inputStram.read(buffer))!= -1){
outputStream.write(buffer,0,len);
}
outputStream.close();
inputStream.close();
}