Jsp+Servlet实现文件上传下载 文件上传(一)

前端之家收集整理的这篇文章主要介绍了Jsp+Servlet实现文件上传下载 文件上传(一)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

文件上传和下载功能是Java Web必备技能,很实用。
本文使用的是Apache下的著名的文件上传组件
org.apache.commons.fileupload 实现
下面结合最近看到的一些资料以及自己的尝试,先写第一篇文件上传。后续会逐步实现下载,展示文件列表,上传信息持久化等。

废话少说,直接上代码

第一步,引用jar包,设置上传目录

commons-fileupload-1.3.1.jar
commons-io-2.4.jar

上传目录:WEB-INF/tempFiles和WEB-INF/uploadFiles

第二步,编写JSP页面

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. <html>
  4. <head>
  5. <title>文件上传测试</title>
  6. </head>
  7. <body>
  8. <form method="POST" enctype="multipart/form-data" action="<%=request.getContextPath()%>/UploadServlet">
  9. 文件: <input type="file" name="upfile"><br/>
  10. <br/>
  11. <input type="submit" value="上传">
  12. </form>
  13. <c:if test="${not empty errorMessage}">
  14. <input type="text" id="errorMessage" value="${errorMessage}" style="color:red;" disabled="disabled">
  15. </c:if>
  16. </body>
  17. </html>

第三步,编写Servlet,处理文件上传的核心

  1. package servlet;
  2. import org.apache.commons.fileupload.FileItem;
  3. import org.apache.commons.fileupload.FileUploadBase;
  4. import org.apache.commons.fileupload.FileUploadException;
  5. import org.apache.commons.fileupload.ProgressListener;
  6. import org.apache.commons.fileupload.disk.DiskFileItemFactory;
  7. import org.apache.commons.fileupload.servlet.ServletFileUpload;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.annotation.WebServlet;
  10. import javax.servlet.http.HttpServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import java.io.File;
  14. import java.io.FileOutputStream;
  15. import java.io.IOException;
  16. import java.io.InputStream;
  17. import java.util.Calendar;
  18. import java.util.Iterator;
  19. import java.util.List;
  20. import java.util.UUID;
  21. /**
  22. * 处理文件上传
  23. *
  24. * @author xusucheng
  25. * @create 2017-12-27
  26. **/
  27. @WebServlet("/UploadServlet")
  28. public class UploadServlet extends HttpServlet {
  29. @Override
  30. protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
  31. //设置文件上传基本路径
  32. String savePath = this.getServletContext().getRealPath("/WEB-INF/uploadFiles");
  33. //设置临时文件路径
  34. String tempPath = this.getServletContext().getRealPath("/WEB-INF/tempFiles");
  35. File tempFile = new File(tempPath);
  36. if (!tempFile.exists()) {
  37. tempFile.mkdir();
  38. }
  39. //定义异常消息
  40. String errorMessage = "";
  41. //创建file items工厂
  42. DiskFileItemFactory factory = new DiskFileItemFactory();
  43. //设置缓冲区大小
  44. factory.setSizeThreshold(1024 * 100);
  45. //设置临时文件路径
  46. factory.setRepository(tempFile);
  47. //创建文件上传处理器
  48. ServletFileUpload upload = new ServletFileUpload(factory);
  49. //监听文件上传进度
  50. ProgressListener progressListener = new ProgressListener() {
  51. public void update(long pBytesRead,long pContentLength,int pItems) {
  52. System.out.println("正在读取文件: " + pItems);
  53. if (pContentLength == -1) {
  54. System.out.println("已读取: " + pBytesRead + " 剩余0");
  55. } else {
  56. System.out.println("文件总大小:" + pContentLength + " 已读取:" + pBytesRead);
  57. }
  58. }
  59. };
  60. upload.setProgressListener(progressListener);
  61. //解决上传文件名的中文乱码
  62. upload.setHeaderEncoding("UTF-8");
  63. //判断提交上来的数据是否是上传表单的数据
  64. if (!ServletFileUpload.isMultipartContent(request)) {
  65. //按照传统方式获取数据
  66. return;
  67. }
  68. //设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MB
  69. upload.setFileSizeMax(1024 * 1024);
  70. //设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MB
  71. upload.setSizeMax(1024 * 1024 * 10);
  72. try {
  73. //使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
  74. List<FileItem> items = upload.parseRequest(request);
  75. Iterator<FileItem> iterator = items.iterator();
  76. while (iterator.hasNext()) {
  77. FileItem item = iterator.next();
  78. //判断jsp提交过来的是不是文件
  79. if (item.isFormField()) {
  80. errorMessage = "请提交文件!";
  81. break;
  82. } else {
  83. //文件
  84. String fileName = item.getName();
  85. if (fileName == null || fileName.trim() == "") {
  86. System.out.println("文件名为空!");
  87. }
  88. //处理不同浏览器提交的文件名带路径问题
  89. fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
  90. //文件扩展名
  91. String fileExtension = fileName.substring(fileName.lastIndexOf(".") + 1);
  92. //判断扩展名是否合法
  93. if (!validExtension(fileExtension)) {
  94. errorMessage = "上传文件非法!";
  95. item.delete();
  96. break;
  97. }
  98. //获得文件输入流
  99. InputStream in = item.getInputStream();
  100. //得到保存文件名称
  101. String saveFileName = createFileName(fileName);
  102. //得到文件保存路径
  103. String realFilePath = createRealFilePath(savePath,saveFileName);
  104. //创建文件输出
  105. FileOutputStream out = new FileOutputStream(realFilePath);
  106. //创建缓冲区
  107. byte buffer[] = new byte[1024];
  108. int len = 0;
  109. while ((len = in.read(buffer)) > 0) {
  110. //写文件
  111. out.write(buffer,len);
  112. }
  113. //关闭输入流
  114. in.close();
  115. //关闭输出
  116. out.close();
  117. //删除临时文件 TODO
  118. item.delete();
  119. //将上传文件信息保存到附件表中 TODO
  120. }
  121. }
  122. } catch (FileUploadBase.FileSizeLimitExceededException e) {
  123. e.printStackTrace();
  124. request.setAttribute("errorMessage","单个文件超出最大值!!!");
  125. request.getRequestDispatcher("pages/upload/upload.jsp").forward(request,response);
  126. return;
  127. } catch (FileUploadBase.SizeLimitExceededException e) {
  128. e.printStackTrace();
  129. request.setAttribute("errorMessage","上传文件的总的大小超出限制的最大值!!!");
  130. request.getRequestDispatcher("pages/upload/upload.jsp").forward(request,response);
  131. return;
  132. } catch (FileUploadException e) {
  133. e.printStackTrace();
  134. request.setAttribute("errorMessage","文件上传失败!!!");
  135. request.getRequestDispatcher("pages/upload/upload.jsp").forward(request,response);
  136. return;
  137. }
  138. request.setAttribute("errorMessage",errorMessage);
  139. request.getRequestDispatcher("pages/upload/upload.jsp").forward(request,response);
  140. }
  141. @Override
  142. protected void doPost(HttpServletRequest request,IOException {
  143. doGet(request,response);
  144. }
  145. private boolean validExtension(String fileExtension) {
  146. String[] exts = {"jpg","txt","doc","pdf"};
  147. for (int i = 0; i < exts.length; i++) {
  148. if (fileExtension.equals(exts[i])) {
  149. return true;
  150. }
  151. }
  152. return false;
  153. }
  154. private String createFileName(String fileName) {
  155. return UUID.randomUUID().toString() + "_" + fileName;
  156. }
  157. /**
  158. * 根据基本路径和文件名称生成真实文件路径,基本路径\\年\\月\\fileName
  159. *
  160. * @param basePath
  161. * @param fileName
  162. * @return
  163. */
  164. private String createRealFilePath(String basePath,String fileName) {
  165. Calendar today = Calendar.getInstance();
  166. String year = String.valueOf(today.get(Calendar.YEAR));
  167. String month = String.valueOf(today.get(Calendar.MONTH) + 1);
  168. String upPath = basePath + File.separator + year + File.separator + month + File.separator;
  169. File uploadFolder = new File(upPath);
  170. if (!uploadFolder.exists()) {
  171. uploadFolder.mkdirs();
  172. }
  173. String realFilePath = upPath + fileName;
  174. return realFilePath;
  175. }
  176. }

第四步,测试

http://localhost:8080/helloweb/pages/upload/upload.jsp




以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

猜你在找的Jsp相关文章