您的位置:首页 > 其它

批量下载多个文件,把它们压缩成压缩包的方式下载

2017-11-08 11:26 751 查看
public void batchDownload(HttpServletResponse response, Integer[] id) {
//判断是否是一个,,如果是则单个下载方式下载
if (historyTaskIds.length == 1) {
//单个下载的方法就不放出来啦
//download(response, id[0]);
} else {
List<Message> list = new ArrayList<Message>();
for (int historyTaskId : historyTaskIds) {
//通过ID查询数据库得到MixerTaskHistory表数据
MixerTaskHistory mixerTaskHistory = mixerTaskHistoryDAO.findMixerTas
4000
kHistoryById(id);
//得到要下载的文件的路径
String renderPath = mixerTaskHistory.getRenderPath();
String renderName = null;
//下载文件命名
if (mixerTaskHistory.getOutType() == 1) {//1为视频
renderName = mixerTaskHistory.getRenderName() + ".mp4";
}
if (mixerTaskHistory.getOutType() == 2) {//2为图片
renderName = mixerTaskHistory.getRenderName() + ".png";
}
File file = new File(renderPath);
if (!file.exists()) {
throw new MyException("资源不存在,不能下载");
} else {
Message message = new Message();
message.setPath(renderPath);//文件路径
message.setMessage(renderName);//文件名字
list.add(message);
}
        }
//通过UUID随机生成一个zip文件名
String uuid = UUID.randomUUID().toString();
String fileName = uuid + ".zip";
String zipName = "D:/mixer/zip/"+fileName;
File zipFile = new File(zipName);
try {
if (!zipFile.exists()) {
zipFile.createNewFile();
}
        } catch (Exception e) {
e.printStackTrace();
logger.error("zip压缩包创建出错");
}
CompressZipUtil compressZipUtil = new CompressZipUtil();
//压缩文件
boolean flag = compressZipUtil.writeZip(list,zipName);
if(flag){
//下载文件
download(response,fileName,zipFile);
}else {
logger.error("压缩文件出现错误");
}
    }
}
//下载方法
private void download(HttpServletResponse response, String fileName, File file) {
response.reset();
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
response.setHeader("Content-Length", String.valueOf(file.length()));
//用于记录以完成的下载的数据量,单位是byte
InputStream inputStream = null;
OutputStream os = null;
try {
//打开本地文件流
inputStream = new FileInputStream(file);
//激活下载操作
os = response.getOutputStream();
//循环写入输出流
byte[] b = new byte[1024 * 1024];
int length;
while ((length = inputStream.read(b)) > 0) {
os.write(b, 0, length);
}
    } catch (IOException e) {
e.printStackTrace();
logger.error("下载出现错误");
} finally {
try {
if (os != null) {
os.close();
}
if (inputStream != null) {
inputStream.close();
}
        } catch (IOException e) {
e.printStackTrace();
logger.error("关流出现错误");
}
    }
}
/**
* 压缩文件方法
* @param files 压缩的文件的名字和路径
* @param zipName压缩包的文件路径
* @return
*/
public boolean writeZip(List<Message> files, String zipName){
boolean flag;
try {
OutputStream os = new BufferedOutputStream(new FileOutputStream(zipName));
ZipOutputStream zos = new ZipOutputStream(os);
//设置文件名编码方式
zos.setEncoding("UTF-8");
byte[] buf = new byte[8192];
int len;
for (int i=0;i<files.size();i++) {
File file = new File(files.get(i).getPath());
if (!file.isFile()) continue;
ZipEntry ze = new ZipEntry(files.get(i).getMessage());
//解决linux乱码问题
ze.setUnixMode(644);
zos.putNextEntry(ze);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
while ((len = bis.read(buf)) > 0) {
zos.write(buf,0, len);
}
zos.closeEntry();
}
zos.closeEntry();
zos.close();
flag = true;
}catch (Exception e){
logger.error("压缩文件出现错误");
flag = false;
e.printStackTrace();

}
return flag;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: