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");// 如果输出的是中文名的文件,在此处就要用URLEncoder.encode方法进行处理
                        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;}}