JSP && Servlet | 上传文件
在WebContent下新建index.jsp
要点:
1. 表单 method 属性应该设置为 POST 方法,不能使用 GET 方法。
2. 表单 enctype 属性应该设置为 multipart/form-data,只有使用enctype="multipart/form-data"
,表单才会把文件的内容编码到HTML请求中。
3. 上传单个文件,应该使用单个带有属性 type="file" 的 <input .../> 标签。为了允许多个文件上传,请包含多个 name 属性值不同的 input 标签。输入标签具有不同的名称属性的值。浏览器会为每个 input 标签关联一个浏览按钮。
1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncoding="utf-8"%> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 <meta charset="utf-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <form action="upload" method="post" enctype="multipart/form-data"> 11 12 请选择上传的图片或文件: 13 <input type="file" name="fileName"/> 14 15 <input type="submit" value="上传"/> 16 </form> 17 </body> 18 </html>
编写Servlet 处理表单请求:
需要两个jar包,
manven引入:
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version>
</dependency>
package servlet; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; @WebServlet(value="/upload") public class Upload extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { porcess(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { porcess(req, resp); } public void porcess(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); //创建一个解析器工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中 4M factory.setSizeThreshold(1024*1024*4); //创建解析类的实例,文件上传解析器 ServletFileUpload sfu = new ServletFileUpload(factory); //开始解析 //设置上传文件的最大值(单个文件) 60M sfu.setFileSizeMax(1024*1024*60); // 设置最大请求值 (包含文件和表单数据) sfu.setSizeMax(1024*1024*70); //每个表单域中数据会封装到一个对应的FileItem对象上 try { // sfu.parseRequest(req): 解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。 List<FileItem> items = sfu.parseRequest(req); //区分表单域 for (FileItem item:items) { //判断输入的类型是 普通输入项 还是文件,isFormField为true,表示这不是文件上传表单域 if(!item.isFormField()){ ServletContext sctx = getServletContext(); //获得存放文件的物理路径 //upload下的某个文件夹 得到当前在线的用户 找到对应的文件夹 String path = sctx.getRealPath("/upload"); System.out.println(path); //获得文件名 String fileName = item.getName(); System.out.println(fileName); //该方法在某些平台(操作系统),会返回路径+文件名 fileName = fileName.substring(fileName.lastIndexOf("\\")+1); File file = new File(path+"\\"+fileName); if(!file.exists()){ item.write(file); req.setAttribute("message","文件上传成功!"); } } else { //普通输入项 ,得到input中的name属性的值 String name=item.getFieldName(); //得到输入项中的值 String value=item.getString("UTF-8"); System.out.println("name="+name+" value="+value); } } } catch (Exception e) { req.setAttribute("message","错误信息: " + e.getMessage()); } req.getRequestDispatcher("/WEB-INF/status.jsp").forward(req, resp); } }
最新版本的 commons-fileupload.x.x.jar 文件。可以从 http://commons.apache.org/proper/commons-fileupload/ 下载。
最新版本的 commons-io-x.x.jar 文件。可以从 http://commons.apache.org/proper/commons-io/ 下载。
来源:
http://www.runoob.com/jsp/jsp-file-uploading.html JSP 文件上传
https://blog.csdn.net/qiyuexuelang/article/details/8861300 Servlet+Jsp实现图片或文件的上传功能