博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb学习——文件上传
阅读量:3943 次
发布时间:2019-05-24

本文共 7406 字,大约阅读时间需要 24 分钟。

Java学习——文件上传

1.准备

导入jar包:

准备工作当然首要的是导入jar包。文件上传一般使用的是apache的开源工具common-fileupload组件。但是这个组件是依赖于common-io这个包的,所以我们要下载并导入这两个jar包。
jar包下载地址:
https://mvnrepository.com/artifact/commons-io/commons-io
https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload
然后我们创建的是一个Web项目当然要导入servlet的一系列jar包了,以下就是所有的jar包
在这里插入图片描述
几个使用到的类介绍:
ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象, 在使用ServletFileUpload对象解析请求时需要DiskFileItemFactory对象。所以,我们需要在进行解析工作前构造好DiskFileItemFactory对象,通过ServletFileUpload对象的构造方法或setFileItemFactory()方法设置ServletFileUpload对象的fileItemFactory属性。
FileItem类:在HTML页面input 必须有 name <input type="file" name="filename">
ServletFileUpload 类:ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象中 . 使用其parseRequest(HttpServletRequest) 方法可以将通过表单中每一个HTML标签提交的数据封装成一个FileItem对象,然后以List列表的形式返回。使用该方法处理上传文件简单易用。
注意事项:

  • 一般我们将上传到服务器的文件放在WEB-INF目录下
  • 为了防止上传的文件因为重名被覆盖,我们会使用UUID生成随机字符串给每一个文件夹取不一样的文件名
  • 要限制上传的文件最大值
  • 可以限制文件上传的类型,通过后缀名判断是否合法

2.编写代码

编写前端JSP页面

1.首页index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>      $Title$      点击进去上传文件  

2.上传文件页面upload.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title<%--注意:method必须为post,因为get无法获取较大数据的文件,post对上传的数据大小没有限制enctype一定要设置成multipart/form-data类型,表示表单中存在上传数据--%>

用户:

文件:

3.上传成功提示页info.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title    <%--    ${msg}==${pageContext.request.contextPath}/upload.do    --%>    ${msg}/upload.do

编写Servlet,在Servlet中实现上传的逻辑

package com.muhan.servlet;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.ProgressListener;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.List;import java.util.UUID;public class UploadServlet extends javax.servlet.http.HttpServlet{    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doPost(req,resp);    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //判断上传的文件是普通表单还是带文件的表单,如果是普通表单就直接返回        if (!ServletFileUpload.isMultipartContent(req)){            return;        }        //如果是带文件的表单        //1.创建上传文件的保存路径,建议在WEB-INF下,安全,用户无法直接访问        String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");        File uploadFile = new File(uploadPath);        if (!uploadFile.exists()){            uploadFile.mkdir();        }        //2.创建临时文件,假如文件超过了预期的大小,我们就把它放在一个临时恩建,过几天自动删除        String tmpPath = this.getServletContext().getRealPath("/WEB-INF/tmp");        File file = new File(tmpPath);        if (!file.exists()){            file.mkdir();        }        //3.处理上传的文件,一般通过流使用。        // 可以使用apache的文件上传组件common-fileupload,它要依赖commons-io        //3.1创建DiskFileItemFactory对象,处理文件上传路径或者大小限制        DiskFileItemFactory factory = getDiskFileItemFactory(file);        //3.2获取ServletFileUpload        ServletFileUpload upload = getServletFileUpload(factory);        //3.3把前端请求解析,封装成一个FileItem对象,处理上传文件        String msg="";        try {            msg = parseUploadResquest(req, uploadPath, upload);        } catch (FileUploadException e) {            e.printStackTrace();        }        //4.Servlet请求转发消息        req.setAttribute("msg",msg);        req.getRequestDispatcher("info.jsp").forward(req,resp);    }    /**     * 3.1创建DiskFileItemFactory对象,处理文件上传路径或者大小限制     */    public static DiskFileItemFactory getDiskFileItemFactory(File file) {        DiskFileItemFactory factory = new DiskFileItemFactory();        //通过工厂设置一个缓冲区,当上传的文件大于这个缓冲区时,把它放到临时文件中        factory.setSizeThreshold(1024*1024);//设置缓冲区大小为1M        factory.setRepository(file);//临时文件的保存目录        return factory;    }    /**     * 3.2获取ServletFileUpload     */    public static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {        ServletFileUpload upload = new ServletFileUpload(factory);        //监听文件上传进度        upload.setProgressListener(new ProgressListener() {            @Override            public void update(long pBytesRead, long pContentLength, int pItem) {                //pBytesRead:读取到的文件大小                //pContentLength:文件大小                System.out.println("总大小"+pBytesRead+"已经上传:"+pBytesRead);            }        });        //处理乱码问题        upload.setHeaderEncoding("utf-8");        //设置单个文件的最大值为10M        upload.setFileSizeMax(1024*1024*10);        //设置总共能够上传文件的大小为100M        upload.setSizeMax(1024*1024*100);        return upload;    }    /**     * 3.3处理上传文件     */    private String parseUploadResquest(HttpServletRequest req, String uploadPath, ServletFileUpload upload) throws FileUploadException, IOException {        List
fileItems = upload.parseRequest(req); for (FileItem fileItem : fileItems) { if (fileItem.isFormField()==true){//判断上传的是普通表单还是带文件的表单 String name = fileItem.getFieldName(); String value = fileItem.getString("utf-8"); System.out.println(name+"=="+value); }else { String uploadFileName = fileItem.getName(); System.out.println("上传的文件名:"+uploadFileName); if (uploadFileName.trim().equals("")||uploadFileName==null){ return "文件名不存在,无法保存(未知文件)"; } //获得上传的文件名 String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1); String fileEndName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1); System.out.println("文件信息,文件名:"+fileName+"文件类型:"+fileEndName); //使用UUID(位移识别的通用吗)保证文件名不重名 String uuidPath = UUID.randomUUID().toString();//uuid码 //=============================处理文件完毕=========================== //文件存到哪儿?文件真实存在路径realPath String realPath = uploadPath + "/" + uuidPath; //给每个文件创建一个对应的文件夹 File realPathFile = new File(realPath); if (!realPathFile.exists()){ realPathFile.mkdir(); } //============================存放文件完毕=========================== //获取文件上传的流 InputStream in = fileItem.getInputStream(); //创建一个文件输出流 FileOutputStream out = new FileOutputStream(realPath+"/"+fileName); byte[] bytes = new byte[1024 * 8];//创建一个缓冲区 int len = 0; while ((len=in.read(bytes))!=-1){ out.write(bytes,0,len); } in.close(); out.close(); //=======================文件传输完毕================================ fileItem.delete();//上传成功之后删除临时文件 } } return "文件上传成功"; }}

配置web.xml

UploadServlet
com.muhan.servlet.UploadServlet
UploadServlet
/upload.do

3.配置Tomcat测试

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查看上传的文件:
在这里插入图片描述

4.项目结构展示

在这里插入图片描述

转载地址:http://doiwi.baihongyu.com/

你可能感兴趣的文章
sklearn中的LogisticRegression模型
查看>>
pandas.get_dummies 的用法
查看>>
机器学习-训练模型的保存与恢复(sklearn)
查看>>
Spark(二): spark-submit命令详解
查看>>
细品 - 逻辑回归(LR)*
查看>>
hive: size与spilt连用
查看>>
Python:ModuleNotFoundError: No module named 模块名 错误及解决方案
查看>>
Python中os与sys两模块的区别
查看>>
nohup详解
查看>>
idea .gitignore对.idea不起作用解决
查看>>
深度学习中的注意力机制(2017版)-易理解
查看>>
Transformer解析-易理解
查看>>
多维数组[:,0]和[:0:1]获取的区别
查看>>
复原Ip地址
查看>>
重建二叉树
查看>>
二叉树根节点到叶子节点的路径数字之和
查看>>
根节点到叶子节点的节点值之和等于 sum的路径
查看>>
判断二叉树是否有从根节点到叶子节点的节点值之和等于sum的路径
查看>>
反转字符串
查看>>
环形链表
查看>>