java文件批量上传、zip方式批量下载

WEB项目:

后台代码:

  1 package com.achong.controller;
  2
  3 import java.io.BufferedInputStream;
  4 import java.io.BufferedOutputStream;
  5 import java.io.File;
  6 import java.io.FileInputStream;
  7 import java.io.FileOutputStream;
  8 import java.io.IOException;
  9 import java.io.InputStream;
 10 import java.io.OutputStream;
 11 import java.util.ArrayList;
 12 import java.util.List;
 13 import java.util.UUID;
 14
 15 import javax.servlet.ServletContext;
 16 import javax.servlet.ServletException;
 17 import javax.servlet.http.HttpServletRequest;
 18 import javax.servlet.http.HttpServletResponse;
 19 import javax.servlet.http.HttpSession;
 20
 21 import org.apache.tools.zip.ZipEntry;
 22 import org.apache.tools.zip.ZipOutputStream;
 23 import org.springframework.http.HttpHeaders;
 24 import org.springframework.http.HttpStatus;
 25 import org.springframework.http.ResponseEntity;
 26 import org.springframework.stereotype.Controller;
 27 import org.springframework.web.bind.annotation.RequestMapping;
 28 import org.springframework.web.bind.annotation.RequestParam;
 29 import org.springframework.web.multipart.MultipartFile;
 30
 31 @Controller
 32 public class HelloHandler {
 33
 34     @RequestMapping("/hello")
 35     public String hello(){
 36         return "success";
 37     }
 38
 39     /**
 40      * javaWeb:
 41      * 1、commons-fileupload.jar     commons-io.jar
 42      * 2、解析当前请求  List<FileItem>  items =  servletFileUpload.parse(request);
 43      * 3、遍历每一个items,文件项,普通项
 44      * 4、如果是文件项,写流的上传方法
 45      *
 46      * SpringMVC:
 47      * 1、文件上传也是使用commons-fileupload.jar
 48      * 2、配置好文件上传解析器;
 49      * 3、
 50      *
 51      * @return
 52      */
 53     @RequestMapping("/upload")
 54     public String upload(@RequestParam("fileName")String fileName,
 55             @RequestParam("photo")MultipartFile[] file){
 56         //保存
 57         System.out.println("普通项的值:"+fileName);
 58         for (MultipartFile multipartFile : file) {
 59             if(multipartFile!=null&&!multipartFile.isEmpty()){
 60                 File file2 = new File("C:/Users/Administrator/Desktop/上传下载测试/"+multipartFile.getOriginalFilename());
 61                 try {
 62                     multipartFile.transferTo(file2);
 63                 } catch (IllegalStateException | IOException e) {
 64                     // TODO Auto-generated catch block
 65                     e.printStackTrace();
 66                 }
 67             }
 68         }
 69         return "success";
 70     }
 71
 72     @RequestMapping("/singleDownload")
 73     public ResponseEntity<byte[]> downloadImg(HttpSession session) throws IOException{
 74         //=============造响应体=============
 75         //1、创建一个ResponseEntity对象。这个对象里面既有响应头还有响应体;
 76         ServletContext servletContext = session.getServletContext();
 77         //1、获取到图片的流,直接交给浏览器;ServletContext.可以从当前项目下获取资源
 78         //2、获取到图片的流
 79         InputStream is = servletContext.getResourceAsStream("/Desert.jpg");
 80         //创建一个和流一样多的数组
 81         byte[] body = new byte[is.available()];
 82         //3、将流的数据放在数组里面
 83         is.read(body);
 84         is.close();
 85
 86         //==============造响应头================
 87         HttpHeaders headers = new HttpHeaders();
 88         //文件下载的响应头
 89         //按照以前乱码的解决方式;
 90
 91         //文件名乱码解决
 92         String filename="单个图片.jpg";
 93         filename = new String(filename.getBytes("GBK"),"ISO8859-1");
 94         headers.add("Content-Disposition", "attachment; filename="+filename);
 95         //第一个参数代表给浏览器的响应数据(响应体)
 96         //第二个参数代表当前响应的响应头(定制响应头)MultiValueMap
 97         //第三个参数代表当前响应状态码(statusCode)HttpStatus
 98         ResponseEntity<byte[]> re = new ResponseEntity<byte[]>(body, headers, HttpStatus.OK);
 99
100         return re;
101     }
102
103     /**
104      * 批量打包下载文件生成zip文件下载
105      *
106      */
107     @RequestMapping("/multDownloadZip")
108     public void downloadFiles(HttpServletRequest request, HttpServletResponse response)
109             throws ServletException, IOException {
110         //获取页面上需要批量下载的链接
111         List<File> files = new ArrayList<File>();
112         String outFilePath = request.getSession().getServletContext().getRealPath("/")
113                 + "upload";
114         System.out.println(outFilePath);
115         File Allfile = new File(outFilePath);
116         System.out.println("Allfile: " + Allfile.getPath());
117         if (Allfile.exists()) {
118             //得到项目跟路径upload下所有的文件和目录的绝对路径
119             File[] fileArr = Allfile.listFiles();
120             for (File file2 : fileArr) {
121                 files.add(file2);
122             }
123         }
124
125         String fileName = UUID.randomUUID().toString() + ".zip";
126         // 在服务器端创建打包下载的临时文件
127         System.out.println("outFilePath: " + outFilePath);
128         createFile(outFilePath, fileName);
129         File file = new File(outFilePath + "\\" + fileName);
130         // 文件输出流
131         FileOutputStream outStream = new FileOutputStream(file);
132         /*
133          * 压缩流
134          * 需要导包:import org.apache.tools.zip.ZipOutputStream;
135          */
136         ZipOutputStream toClient = new ZipOutputStream(outStream);
137         toClient.setEncoding("gbk");
138         zipFile(files, toClient);
139         toClient.close();
140         outStream.close();
141         this.downloadFile(file, response, true);
142     }
143
144     // 创建文件
145     public void createFile(String path, String fileName) {
146         // path表示你所创建文件的路径, fileName为文件名
147         File file = new File(path, fileName);
148         System.out.println(file.getPath());
149         if (!file.exists()) {
150             try {
151                 file.createNewFile();
152             } catch (IOException e) {
153                 e.printStackTrace();
154             }
155         }
156
157     }
158
159     /**
160      * 压缩文件列表中的文件
161      *
162      * @param files
163      * @param outputStream
164      * @throws IOException
165      */
166     public static void zipFile(List<File> files, ZipOutputStream outputStream) throws IOException, ServletException {
167         try {
168             int size = files.size();
169             // 压缩列表中的文件
170             for (int i = 0; i < size; i++) {
171                 File file = (File) files.get(i);
172                 zipFile(file, outputStream);
173             }
174         } catch (IOException e) {
175             throw e;
176         }
177     }
178
179     /**
180      * 将文件写入到zip文件中
181      *
182      * @param inputFile
183      * @param outputstream
184      * @throws Exception
185      */
186     public static void zipFile(File inputFile, ZipOutputStream outputstream) throws IOException, ServletException {
187         try {
188             if (inputFile.exists()) {
189                 if (inputFile.isFile()) {
190                     FileInputStream inStream = new FileInputStream(inputFile);
191                     BufferedInputStream bInStream = new BufferedInputStream(inStream);
192                     /*
193                      * 需要导包:import org.apache.tools.zip.ZipEntry;
194                      */
195                     ZipEntry entry = new ZipEntry(inputFile.getName());
196                     outputstream.putNextEntry(entry);
197
198                     final int MAX_BYTE = 10 * 1024 * 1024; // 最大的流为10M
199                     long streamTotal = 0; // 接受流的容量
200                     int streamNum = 0; // 流需要分开的数量
201                     int leaveByte = 0; // 文件剩下的字符数
202                     byte[] inOutbyte; // byte数组接受文件的数据
203
204                     streamTotal = bInStream.available(); // 通过available方法取得流的最大字符数
205                     streamNum = (int) Math.floor(streamTotal / MAX_BYTE); // 取得流文件需要分开的数量
206                     leaveByte = (int) streamTotal % MAX_BYTE; // 分开文件之后,剩余的数量
207
208                     if (streamNum > 0) {
209                         for (int j = 0; j < streamNum; ++j) {
210                             inOutbyte = new byte[MAX_BYTE];
211                             // 读入流,保存在byte数组
212                             bInStream.read(inOutbyte, 0, MAX_BYTE);
213                             outputstream.write(inOutbyte, 0, MAX_BYTE); // 写出流
214                         }
215                     }
216                     // 写出剩下的流数据
217                     inOutbyte = new byte[leaveByte];
218                     bInStream.read(inOutbyte, 0, leaveByte);
219                     outputstream.write(inOutbyte);
220                     outputstream.closeEntry(); // Closes the current ZIP entry
221                     // and positions the stream for
222                     // writing the next entry
223                     bInStream.close(); // 关闭
224                     inStream.close();
225                 }
226             } else {
227                 throw new ServletException("文件不存在!");
228             }
229         } catch (IOException e) {
230             throw e;
231         }
232     }
233
234     /**
235      * 下载文件
236      *
237      * @param file
238      * @param response
239      */
240     public void downloadFile(File file, HttpServletResponse response, boolean isDelete) {
241         try {
242             // 以流的形式下载文件。
243             BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file.getPath()));
244             byte[] buffer = new byte[fis.available()];
245             fis.read(buffer);
246             fis.close();
247             // 清空response
248             response.reset();
249             OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
250             response.setContentType("application/octet-stream");
251             response.setHeader("Content-Disposition",
252                     "attachment;filename=" + new String(file.getName().getBytes("UTF-8"), "ISO-8859-1"));
253             toClient.write(buffer);
254             toClient.flush();
255             toClient.close();
256             if (isDelete) {
257                 file.delete(); // 是否将生成的服务器端文件删除
258             }
259         } catch (IOException ex) {
260             ex.printStackTrace();
261         }
262     }
263 }

index页面:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 <%
 9     pageContext.setAttribute("ctx", request.getContextPath());
10 %>
11 </head>
12 <body>
13 <a href="hello">Hello</a><br/>
14 <!--相对路径容易出问题,我们都推荐写绝对路径。
15     base:为所有相对路径指定新的标准;  -->
16 <hr/>
17 <!--
18 1、上传文件的表单enctype="multipart/form-data"
19 -->
20 <form action="${ctx }/upload" method="post" enctype="multipart/form-data">
21     <input type="file" name="photo"/>
22     <input type="file" name="photo"/>
23     <input type="file" name="photo"/>
24     <input type="file" name="photo"/>
25     描述:<input type="text" name="fileName"/>
26     <input type="submit" value="上传"/>
27 </form>
28 <a href="${ctx }/singleDownload">下载单个</a><br/>
29 <a href="${ctx }/multDownloadZip">批量下载</a>
30 </body>
31 </html>

success页面:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10 <h1>成功!</h1>
11 </body>
12 </html>

WebContent目录结构:

时间: 2024-10-14 00:15:57

java文件批量上传、zip方式批量下载的相关文章

Java解压上传zip或rar文件,并解压遍历文件中的html的路径

1.本文只提供了一个功能的代码 public String addFreeMarker() throws Exception { HttpSession session = request.getSession(); User user = (User) session.getAttribute(Constant.USER_SESSION_KEY); String realName = user.getRealName(); System.out.println("--------获取登录用户信

asp.net+swfupload 多图片批量上传(附源码下载)

asp.net的文件上传都是单个文件上传方式,无法执行一次性多张图片批量上传操作,要实现多图片批量上传需要借助于flash,通过flash选取多个图片(文件),然后再通过后端服务进行上传操作. 本次教程所使用的flash上传文件是 swfupload,下面会有源码下载链接. 使用工具 vs 2010. 演示效果图 第一步 新建一个web项目 第二步 引入所需swfuplod文件(swfupload.swf,js,css等) 第三步 新建一个一般处理程序(upload.ashx) upload.a

亚马逊如何批量上传Flat.File 上传文档制作

亚马逊批量上传简介众所周知的,亚马逊是可以通过表格批量上传,通过批量上传的方式能更快的上架产品,更好的管理线上的产品.工厂如果能直接通过数据包给分销客户,那么分销客户拿到数据,稍微修改优化一下标题,关键,加品牌,就能很快的上架铺货您的产品了亚马逊批量上传优势Excel 表格管理产品通过制作的 excel 表格首次绑定好账户,无需登录亚马逊后台即可一键同步关联线上库存产品,编辑好的表格 3000 个产品即可以在数分钟内上架,下架操作,合理利用excel 公式能在数分钟内批量增加品牌.替换关键字.批

文件断点上传,html5实现前端,java实现服务器

断点上传能够防止意外情况导致上传一半的文件下次上传时还要从头下载,网上有很多关于断点的实现,这篇文章只是从前到后完整的记录下一个可用的实例,由于生产环境要求不高,而且就是提供给一两个人用,所以我简化了诸多过程,不用flash,也不用applet,只是通过html5的新特性进行浏览器端的处理. 简单说下关键点 如果上次传到n字节,那么浏览器下次续传直接就是从文件的n字节开始向服务器传送数据,而不是都传过去,服务器从n字节开始接收. html5能给文件分片,所以每次上传完一块文件后,应该返回当前已经

[Pulgin] 利用swfupload实现java文件批量上传

URL:http://blog.csdn.net/xuweilinjijis/article/details/8876305 之前在网上找过很多相关资料,很多所谓的批量上传都是忽悠人的,真正的批量上传指的是 用户一次性可以选择多个文件,然后上传是将所有选取的文件上传到服务器.java中真正可以实现批量上传的技术大致有两种:一种是通过flash:一种是 通过applet:不过html5也可以支持批量拖选.两种方式有各自的优缺点,其中flash对于浏览器兼容性较好,基本可以满足市面上大众浏览器,缺

jquery文件批量上传控件Uploadify3.2(java springMVC)

人比較懒  有用为主 不怎么排版了 先放上Uploadify的官网链接:http://www.uploadify.com/  -->里面能够看到PHP的演示样例,属性说明,以及控件下载地址.分flash版(免费)和html5版(收费). 官网上能够看到效果演示. 另外在网上找到了一份Uploadify3.2的中文API文档.能够在我上传的资源里面下载. 以下就是一个基于springMVC的文件上传演示样例,看起来可能比文档更直观一些··· 1.下载插件放到项目中 2.在jsp页面中引入下面JS和

Java Miniui实现批量上传文件demo 201906221520

可能需要的jar包: 需要miniui(类似easyui). Test2019062201.jsp <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "

Android网络编程之使用HttpClient批量上传文件

请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 我曾在<Android网络编程之使用HTTP访问网络资源>一文中介绍过HttpCient的使用,这里就不在累述了,感兴趣的朋友可以去看一下.在这里主要介绍如何通过HttpClient实现文件上传. 1.预备知识: 在HttpCient4.3之前上传文件主要使用MultipartEntity这个类,但现在这个类已经不在推荐使用了.随之替代它的类是MultipartEntityBuilder. 下面

转 Android网络编程之使用HttpClient批量上传文件 MultipartEntityBuilder

请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 http://www.tuicool.com/articles/Y7reYb 我曾在<Android网络编程之使用HTTP访问网络资源>一文中介绍过HttpCient的使用,这里就不在累述了,感兴趣的朋友可以去看一下.在这里主要介绍如何通过HttpClient实现文件上传. 1.预备知识: 在HttpCient4.3之前上传文件主要使用MultipartEntity这个类,但现在这个类已经不在推

android批量文件上传(android批量图片上传)

项目中多处用到文件批量上传功能,今天正好解决了此问题,在此写出来,以便日后借鉴. 首先,以下架构下的批量文件上传可能会失败或者不会成功: 1.android客户端+springMVC服务端:服务端采用org.springframework.web.multipart.MultipartHttpServletRequest作为批量上传接收类,这种搭配下的批量文件上传会失败,最终服务端只会接受到一个文件,即只会接受到第一个文件.可能因为MultipartHttpServletRequest对serv