admin 管理员组文章数量: 1184232
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;}}版权声明:本文标题:Java编程必备:ByteOutStream流帮你玩转文件压缩! 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1774499716a3571870.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论