先不多说,直接贴代码吧,在服务器的E盘下放一个E:/manual.rar的压缩包
package com.cellstrain.icell.controller; import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.*;import java.net.URLEncoder;import java.util.ArrayList;import java.util.List;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream; @Controllerpublic class ManualController { /** * 产品手册批量下载(以压缩包的格式) * * @param request * @param response * @return * @throws Exception */ @RequestMapping("downloadManual") public HttpServletResponse downLoadFiles(HttpServletRequest request, HttpServletResponse response) throws Exception { try { File dir = new File("E:\\manual\\"); /**创建一个临时压缩文件,我们会把文件流全部注入到这个文件中,这里的文件你可以自定义是.rar还是.zip**/ File file = new File("E:/manual.rar"); if (!file.exists()) { file.createNewFile(); } response.reset(); return downloadZip(file, response); } catch (Exception e) { e.printStackTrace(); } /**直到文件的打包已经成功了,文件的打包过程被我封装在FileUtil.zipFile这个静态方法中,稍后会呈现出来,接下来的就是往客户端写数据了**/ return response; } /** * 以流的形式下载文件 * * @param file * @param response * @return */ public static HttpServletResponse downloadZip(File file, HttpServletResponse response) { try { // 以流的形式下载文件。 InputStream fis = new BufferedInputStream(new FileInputStream(file.getPath())); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); // 清空response response.reset(); OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); //如果输出的是中文名的文件,在此处就要用URLEncoder.encode方法进行处理 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8")); toClient.write(buffer); toClient.flush(); toClient.close(); } catch (IOException ex) { ex.printStackTrace(); } finally { try { File f = new File(file.getPath());// f.delete(); } catch (Exception e) { e.printStackTrace(); } } return response; } /** * 根据输入的文件与输出流对文件进行打包 * * @param inputFile * @param ouputStream */ public static void zipFile(File inputFile, ZipOutputStream ouputStream) { try { if (inputFile.exists()) { /**如果是目录的话这里是不采取操作的,至于目录的打包正在研究中**/ if (inputFile.isFile()) { FileInputStream IN = new FileInputStream(inputFile); BufferedInputStream bins = new BufferedInputStream(IN, 1024); //org.apache.tools.zip.ZipEntry ZipEntry entry = new ZipEntry(inputFile.getName()); ouputStream.putNextEntry(entry); // 向压缩文件中输出数据 int nNumber; byte[] buffer = new byte[1024]; while ((nNumber = bins.read(buffer)) != -1) { ouputStream.write(buffer, 0, nNumber); } // 关闭创建的流对象 bins.close(); IN.close(); } else { try { File[] files = inputFile.listFiles(); for (int i = 0; i < files.length; i++) { zipFile(files[i], ouputStream); } } catch (Exception e) { e.printStackTrace(); } } } } catch (Exception e) { e.printStackTrace(); } }} 效果图如下:
可以自己手动选择文件的存放位置,pdf、word、excel等类似
时间: 2024-10-06 00:52:41