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实现图片或文件的上传功能

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{
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {porcess(req, resp);}@Overrideprotected 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);//开始解析//设置上传文件的最大值(单个文件) 60Msfu.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);}}

猜你喜欢

转载自www.cnblogs.com/jj81/p/9836062.html