[关闭]
@Dukebf 2017-07-12T00:04:50.000000Z 字数 2489 阅读 1160

jsp入门(二)之实现文件上传

jsp


0x00 前言

因为项目需要使用jsp来搭建个小网站,有个上传文件的功能,自己又是刚入手jsp,就碰上了不少问题。

0x01 配置环境

首先下载项目依赖的两个文件,commons-fileupload (官网下载) 以及 commons-io (官网下载)。

java ee 中新建动态网站项目,然后在 WebContent -> WEB-INF -> lib 中 放入这两个包,如果没有lib文件夹,就新建一个,分别右键点击这两个包,Bulid Path -> Add to Bulid Path。

注意: 一定要把包放入指定的 lib 文件夹中,否则会有找不到类的错误。

java.lang.ClassNotFoundException:org.apache.commons.fileupload.FileItemFactory

或者

java.lang.NoClassDefFoundError:org/apache/commons/fileupload/FileItemFactor

0x02 上传文件代码

上传文件的代码,是从菜鸟教程(传送门)上学的。
简单描述,就是使用了Apache中 commons-fileupload 和 commons-io-2.5 两个包,然后通过servlet处理POST请求,然后存储文件到指定位置中。

代码主要由两个界面(upload.jsp, message.jsp)和一个servlet(UploadServlet.java)组成。

先看下UploadServlet.java 里面的主要逻辑

  1. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. // 检测是否为多媒体上传
  3. if(!ServletFileUpload.isMultipartContent(request)){
  4. PrintWriter writer = response.getWriter();
  5. writer.println("Error: 表单必须包含enctype=multipart/form-data");
  6. writer.flush();
  7. return;
  8. }
  9. // 配置上传参数
  10. DiskFileItemFactory factory = new DiskFileItemFactory();
  11. // 设置内存临界值
  12. factory.setSizeThreshold(MEMORY_THRESHOLD);
  13. // 设置临时存储目录
  14. factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
  15. ServletFileUpload upload = new ServletFileUpload(factory);
  16. // 设置最大文件上传值
  17. upload.setFileSizeMax(MAX_FILE_SIZE);
  18. // 设置最大请求值(包含文件和表单数据)
  19. upload.setSizeMax(MAX_REQUEST_SIZE);
  20. // 中文处理
  21. upload.setHeaderEncoding("UTF-8");
  22. // 构造临时路径来存储上传的文件
  23. // 路径是相对当前应用的目录
  24. String uploadPath = getServletContext().getRealPath("./")+File.separator+UPLOAD_DIRECTORY;
  25. //如果目录不存在,则创建
  26. File uploadDir = new File(uploadPath);
  27. if(!uploadDir.exists()){
  28. uploadDir.mkdir();
  29. }
  30. try {
  31. // 解析请求的内容,提取文件数据
  32. List<FileItem> formItems = upload.parseRequest(request);
  33. if (formItems != null && formItems.size() > 0) {
  34. // 迭代表单数据
  35. for (FileItem item : formItems) {
  36. // 处理不在表单中的字段
  37. if (!item.isFormField()) {
  38. String fileName = new File(item.getName()).getName();
  39. String filePath = uploadPath + File.separator + fileName + fileName;
  40. File storeFile = new File(filePath);
  41. // 在控制台输出文件的上传路径
  42. System.out.println(filePath);
  43. // 保存文件到硬盘
  44. item.write(storeFile);
  45. request.setAttribute("message", "文件上传成功");
  46. }
  47. }
  48. }
  49. } catch (Exception e) {
  50. request.setAttribute("message", "错误信息:"+e.getMessage());
  51. }
  52. // 跳转到 message.jsp
  53. getServletContext().getRequestDispatcher("/message.jsp").forward(request, response);

再看看 upload.jsp 中的,需要注意的是在表单中需要设置 <form enctype="multipart/form-data"> .

  1. <h1>文件上传实例</h1>
  2. <form action="/blackandwhite/UploadServlet" method="POST" enctype="multipart/form-data">
  3. <p>选择一个文件</p>
  4. <input type="file" name="uploadFile">
  5. <input type="submit" value="上传" >
  6. </form>

最后一个文件 message.jsp 是用了显示上传的结果信息:

  1. <h2 style="text-align:center;">结果:${message}</h2>

然后就可以运行了。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注