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





  • 相关阅读:
    shell-变量的数值运算let内置命令
    shell-变量的数值运算符-计算双括号(())的使用
    shell-批量修改文件名及扩展名多案例
    shell-变量的字串应用技术
    一个MVVM前端扩展器
    测试一个mysql 悲观锁
    spring rest项目提示Request method 'PUT' not supported Method Not Allowed 405 错误
    Mysql 使用sql语句添加列,修改列默认值,添加类注释
    理解java泛型中的 上界extend 下界super
    mysql存储过程游标循环装载字符串SQL语句示例
  • 原文地址:https://www.cnblogs.com/jj81/p/9836062.html
Copyright © 2020-2023  润新知