Web端实现用户文件上传

目录​​​​​​​

 

一、前端页面

二:servlet层实现

三、后续的文件


 一、前端页面

界面:

代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="${pageContext.request.contextPath}/upload">
    用户名:<input type="text" name="user"><br><hr>
    <input type="file" name="file1"><hr>
    <input type="file" name="file2"><hr>
    <input type="submit" value="上传">
</form>
</body>
</html>

提交后跳转到相应的界面提示上传情况:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
nihc
<h3>
    ${msg}    //在servlet中赋予相应的值
</h3>
</body>
</html>

二:servlet层实现

pom.xml中写入相应的依赖:

<dependencies>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.5</version>
    </dependency>
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>
</dependencies>

web.xml中配置前端页面跳转:

<servlet>
    <servlet-name>file</servlet-name>
    <servlet-class>fileupload.fileservlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>file</servlet-name>
    <url-pattern>/upload</url-pattern>
  </servlet-mapping>

进入servlet:

import org.apache.commons.fileupload.FileItem;
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.HttpServlet;
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 fileservlet extends 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;}//如果是否是文件

        //文件的上传路径⏫
        String uploadPath = this.getServletContext().getRealPath("WEB-INF/upload");
        File uploadFile = new File(uploadPath);
        if (!uploadFile.exists()) {
            uploadFile.mkdir();
        }

        //临时文件的上传路径
        String tmpPath = this.getServletContext().getRealPath("WEB-INF/tmp");
        File tmpFile = new File(tmpPath);
        if (!tmpFile.exists()) {
            tmpFile.mkdir();
        }

    //将核心步骤封装成三个方法📦
        
        //1、获得磁盘文件工厂对象
        DiskFileItemFactory itemFactory=getDiskFileItemFactory(tmpFile);

        //2、获得Servlet文件上传对象
        ServletFileUpload upload=getServletFileUpload(itemFactory);

        //3、解析前端请求
        String msg=getParseRequest(upload,req,uploadPath);

        //发送到前端
        req.setAttribute("msg",msg);
        System.out.println(msg);
        req.getRequestDispatcher("/info.jsp").forward(req,resp);
    }

    private DiskFileItemFactory getDiskFileItemFactory(File tmpFile){
        DiskFileItemFactory itemFactory = new DiskFileItemFactory();
        itemFactory.setSizeThreshold(1024*1024*20);  //设置一个缓冲区,当文件大于这个缓冲区(20MB)的时候,将它放到临时文件中
        itemFactory.setRepository(tmpFile); //临时文件的保存目录
        return itemFactory;
    }

    private ServletFileUpload getServletFileUpload(DiskFileItemFactory itemFactory){
        ServletFileUpload upload = new ServletFileUpload(itemFactory);
        //监听文件上传的进度
        upload.setProgressListener(new ProgressListener() {
            @Override
            public void update(long l, long l1, int i) {
                System.out.println("总大小:"+l1+" 已上传:"+l);
            }
        });

        upload.setHeaderEncoding("UTF-8");
        upload.setFileSizeMax(1024*1024*100);    //设置单个文件的最大值100MB
        upload.setSizeMax(1024*1024*200);        //设置总共能够上传的文件的大小200MB
        return upload;
    }

    private String getParseRequest(ServletFileUpload upload,HttpServletRequest req,String uploadPath) {
        String msg=null;//上传是否成功的信息
        try {
            List<FileItem> fileItems = upload.parseRequest(req);//会解析出三个表单
            System.out.println("内容:"+fileItems);
            //遍历表单
            for (FileItem fileItem : fileItems) {
                if (fileItem.isFormField()&&fileItem.getName()==null) {
                    //是普通表单的话
                    System.out.print("普通表单=>");
                    String name = fileItem.getFieldName();  //前端单控件的name
                    String value = fileItem.getString("UTF-8"); //输出的编码方式
                    System.out.println(name + ":" + value);
                } else {    //是文件
                    if (fileItem.getSize()>1024*1024*100) {
                        msg="文件超过100MB!已保存到暂存区";
                    }
                    System.out.print("文件=>");
                    
                    //==================处理文件==================
                    String uploadPathName = fileItem.getName(); //得到文件绝对路径
                    if (uploadPathName.trim().equals("") || uploadPathName == null) {
                        continue;
                    }  //路径名不合法
                    String uploadName = uploadPathName.substring(uploadPathName.lastIndexOf("/") + 1);  //通过路径获取文件名
                    String Extension = uploadPathName.substring(uploadPathName.lastIndexOf(".") + 1);   //通过路径获取文件扩展名

                    String uuid = UUID.randomUUID().toString(); //使用UUID保证文件名唯一

                    System.out.println("上传的文件是:" + uploadName  + "  UUID是:" + uuid);

                    //==================存放地址==================
                    String readPath = uploadPath + "/" + uuid;    //文件的最终目录--> WEB-INF/upload/uuid名
                    File readPathName = new File(readPath); 
                    if (!readPathName.exists()) {
                        readPathName.mkdir();   //给每个文件创建一个单独的文件夹
                    }

                    //==================文件传输==================
                    InputStream in = fileItem.getInputStream(); //通过流
                    FileOutputStream out = new FileOutputStream(readPathName + "/" + uploadName);

                    //设置一个缓冲区(1MB)
                    byte[] buffer = new byte[1024*1024];
                    int len = 0;
                    while ((len = in.read(buffer))!=0) {
                        out.write(buffer, 0, len);
                    }

                    out.close();
                    in.close();
                    msg = "文件上传成功!";
                    fileItem.delete();  //移除对象
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("出现异常!");
        }
        return msg;
    }
}

三、后续的文件

文件会被上传到部署的Tomcat服务器上,在对应的项目文件夹中的WEB-INF 中,保证从外部无法访问。

不超过指定大小的文件在:WEB-INF/upload/uuid名字

超过的则会存放在服务器的临时文件区

而当服务器重启或关闭时,全部文件就会被销毁

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓晓的雨夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值