其他分享
首页 > 其他分享> > jsp文件上传的笔记

jsp文件上传的笔记

作者:互联网

记录一下jsp的上传文件的写法。。主要是这个东西不好记,我也不想记。。写下来是最好的,到时候肯定会忘记。。。

1. 导入依赖

文件上传首先是需要两个包,这个随便找个教程了解一下都是这样的。
一个是
fileupload 还有一个是IO 包,都是Apache基金会下面的项目。。。
https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload

https://mvnrepository.com/artifact/commons-io/commons-io/2.8.0

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>


2. 文件上传的表单

例如下面这样写,
注意:这个表单必须是post请求,并且需要有 enctype=“multipart/form-data” 这个属性

 <form method="post" action="${pageContext.request.contextPath}/ad/fileupload" enctype="multipart/form-data">
	<input type="text" required name="filename">
	<input type="file" required name="uploadfile">
 </form>

3. servlet

然后就可以开始写我们上传文件的逻辑了
这里有三个对象要注意
分别是

  1. DiskFileItemFactory:工厂类
  2. ServletFileUpload:处理文件上传
  3. FileItem:具体的表单对象
@WebServlet(urlPatterns = "/ad/fileupload")
public class AdAddServlet extends HttpServlet {
    AdServiceImpl adService = new AdServiceImpl();
    // 上传配置
    private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3;  // 3MB
    private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
    private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String fileName = "";
        //如果这个是普通的表单,那就直接结束方法
        if (!ServletFileUpload.isMultipartContent(req)) {
            return;
        }
        //上传文件的目录最好在web-inf下面,安全,用户无法直接访问
        String uploadPath = this.getServletContext().getRealPath("/upload/img");

        File uploadFile = new File(uploadPath);
        if (!uploadFile.exists()) {
            uploadFile.mkdir();
        }

        //缓存  -- 临时文件:如果文件超过了预期的大小,那就把这个文件放到临时文件中华,过几天再删除
        String temPath = this.getServletContext().getRealPath("/WEB-INF/tem");
        System.out.println(uploadPath);
        File temFile = new File(temPath);
        if (!temFile.exists()) {
            temFile.mkdir();
        }

        //1. 创建 DiskFileItemFactory 用于限制文件大小之类的参数,如果不写的话,那就是默认值了
        DiskFileItemFactory factory = getDiskFileItemFactory(temFile);

        //2. 获取ServletFileUpload
        ServletFileUpload upload = getServletFileUpload(factory);

        //3. 把前端的请求封装成一个FileItem对象 (每一个表单对象)
        try {
            List<FileItem> fileItems = upload.parseRequest(req);
            for (FileItem fileItem : fileItems) {
                if (fileItem.isFormField()) {//如果这个是普通的表单就正常的流程
                	 System.out.println("表单字段的name:"+fileItem.getFieldName());
                 	 System.out.println("表单字段的value"+fileItem.getString("utf-8"));
                } else {//文件
                    //处理文件
                    String uploadFileName = fileItem.getName();
                    if (uploadFileName.trim().equals("") || uploadFileName == null) { //文件名不合法
                        continue;
                    }

                    //获取上传的文件名
                    fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
  
                    fileItem.write(new File(uploadPath + "/" + fileName));
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        resp.sendRedirect("../upload/img/" + fileName);
    }

    //封装DiskFileItemFactory 和 ServletFileUpload 对象
    private static DiskFileItemFactory getDiskFileItemFactory(File file) {
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(MEMORY_THRESHOLD);
        factory.setRepository(file); //临时文件
        return factory;
    }

    private static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 设置最大文件上传值
        upload.setFileSizeMax(MAX_FILE_SIZE);
        // 设置最大请求值 (包含文件和表单数据)
        upload.setSizeMax(MAX_REQUEST_SIZE);
        // 中文处理
        upload.setHeaderEncoding("UTF-8");
        return upload;
    }
}

注意: 最后上传之后的文件,将不会出现在你的项目中,而是出现在编译的目录中。。 如果你是用的idea,那就是out目录中,可以自己找到
在这里插入图片描述

标签:factory,笔记,upload,jsp,commons,上传,DiskFileItemFactory,ServletFileUpload
来源: https://blog.csdn.net/zhihu_0/article/details/112390715