@Dukebf
2017-07-11T16:04:50.000000Z
字数 2489
阅读 1317
jsp
因为项目需要使用jsp来搭建个小网站,有个上传文件的功能,自己又是刚入手jsp,就碰上了不少问题。
首先下载项目依赖的两个文件,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
上传文件的代码,是从菜鸟教程(传送门)上学的。
简单描述,就是使用了Apache中 commons-fileupload 和 commons-io-2.5 两个包,然后通过servlet处理POST请求,然后存储文件到指定位置中。
代码主要由两个界面(upload.jsp, message.jsp)和一个servlet(UploadServlet.java)组成。
先看下UploadServlet.java 里面的主要逻辑
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 检测是否为多媒体上传if(!ServletFileUpload.isMultipartContent(request)){PrintWriter writer = response.getWriter();writer.println("Error: 表单必须包含enctype=multipart/form-data");writer.flush();return;}// 配置上传参数DiskFileItemFactory factory = new DiskFileItemFactory();// 设置内存临界值factory.setSizeThreshold(MEMORY_THRESHOLD);// 设置临时存储目录factory.setRepository(new File(System.getProperty("java.io.tmpdir")));ServletFileUpload upload = new ServletFileUpload(factory);// 设置最大文件上传值upload.setFileSizeMax(MAX_FILE_SIZE);// 设置最大请求值(包含文件和表单数据)upload.setSizeMax(MAX_REQUEST_SIZE);// 中文处理upload.setHeaderEncoding("UTF-8");// 构造临时路径来存储上传的文件// 路径是相对当前应用的目录String uploadPath = getServletContext().getRealPath("./")+File.separator+UPLOAD_DIRECTORY;//如果目录不存在,则创建File uploadDir = new File(uploadPath);if(!uploadDir.exists()){uploadDir.mkdir();}try {// 解析请求的内容,提取文件数据List<FileItem> formItems = upload.parseRequest(request);if (formItems != null && formItems.size() > 0) {// 迭代表单数据for (FileItem item : formItems) {// 处理不在表单中的字段if (!item.isFormField()) {String fileName = new File(item.getName()).getName();String filePath = uploadPath + File.separator + fileName + fileName;File storeFile = new File(filePath);// 在控制台输出文件的上传路径System.out.println(filePath);// 保存文件到硬盘item.write(storeFile);request.setAttribute("message", "文件上传成功");}}}} catch (Exception e) {request.setAttribute("message", "错误信息:"+e.getMessage());}// 跳转到 message.jspgetServletContext().getRequestDispatcher("/message.jsp").forward(request, response);
再看看 upload.jsp 中的,需要注意的是在表单中需要设置 <form enctype="multipart/form-data"> .
<h1>文件上传实例</h1><form action="/blackandwhite/UploadServlet" method="POST" enctype="multipart/form-data"><p>选择一个文件</p><input type="file" name="uploadFile"><input type="submit" value="上传" ></form>
最后一个文件 message.jsp 是用了显示上传的结果信息:
<h2 style="text-align:center;">结果:${message}</h2>
然后就可以运行了。