Java下载压缩文件
List<File> files =newArrayList<>();
String fileName = URLEncoder.encode("文件名"+ dateToDayString +".zip","UTF-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition","attachment;fileName="+ fileName);
response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma","public");
response.setDateHeader("Expires",(System.currentTimeMillis()+10000));
String videoPath ="csv"+"/";
zipComponent.downLoadFiles(files, response, nasPath + videoPath, fileName);
package com.sf.argus.web.component;import java.io.*;import java.util.List;import java.util.zip.GZIPInputStream;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;import javax.servlet.http.HttpServletResponse;import cn.hutool.core.io.FileUtil;import cn.hutool.core.io.IoUtil;import cn.hutool.http.HttpRequest;import cn.hutool.http.HttpResponse;import cn.hutool.http.HttpUtil;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;@Component@Slf4jpublicclassZipComponent{private String cosDomainProxy;private String nasPath;private String csv;public HttpServletResponse downLoadFiles(List<File> files, HttpServletResponse response, String zipPath,String zipName){
String zipFilename = zipPath + zipName;
File file =newFile(zipFilename);try(FileOutputStream fileOut =newFileOutputStream(file)){
log.info("准备新建下载");if(!file.exists()){
file.createNewFile();
log.info("新建完成");}
response.reset();
ZipOutputStream zipOut =newZipOutputStream(fileOut);zipFile(files, zipOut);
zipOut.close();
fileOut.close();
log.info("压缩文件是否生成:{} 文件大小:{}", file.exists(),file.length());returndownloadZip(file, response);}catch(Exception e){
log.error("downLoadFiles error", e);}return response;}publicvoidzipFile(List<File> files, ZipOutputStream outputStream){int size = files.size();for(int i =0; i < size; i++){
File file = files.get(i);zipFile(file, outputStream);}}publicvoidzipFile(File inputFile, ZipOutputStream outputStream){
InputStream inputStream = null;
BufferedInputStream bins = null;try{
String path = inputFile.getPath();
StringBuilder sb =newStringBuilder();
sb.append(cosDomainProxy).append(path);
HttpRequest get = HttpUtil.createGet(sb.toString());
HttpResponse execute = get.execute();
log.info("path:{} from proxy read file status:{}", path, execute.getStatus());if(!execute.isOk()){return;}
inputStream = execute.bodyStream();
bins =newBufferedInputStream(inputStream,512);
ZipEntry entry =newZipEntry(inputFile.getName());
outputStream.putNextEntry(entry);int nNumber;byte[] buffer =newbyte[512];while((nNumber = bins.read(buffer))!=-1){
outputStream.write(buffer,0, nNumber);}}catch(Exception e){
log.error("zipFile error", e);}finally{try{if(bins != null){
bins.close();}if(inputStream != null){
inputStream.close();}}catch(IOException e){
log.error("zipFile error", e);}}}public HttpServletResponse downloadZip(File file, HttpServletResponse response){if(!file.exists()){
log.info("待压缩的文件目录:{}不存在", file);}else{try(InputStream fis =newBufferedInputStream(newFileInputStream(file.getPath()))){byte[] buffer =newbyte[fis.available()];while(fis.read(buffer)>0){
response.reset();try(OutputStream toClient =newBufferedOutputStream(response.getOutputStream())){
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment;filename="+newString(file.getName().getBytes("GB2312"),"ISO8859-1"));
toClient.write(buffer);
toClient.flush();}}}catch(IOException ex){
log.error("downloadZip error", ex);}finally{try{
File f =newFile(file.getPath());
f.delete();}catch(Exception e){
log.error("delete file error", e);}}}return response;}}
发布评论