文件上传

1.准备工作#

jar包

commons-io

commons-fileup

2.使用类介绍#

文件上传注意事项#

image-20200726101643484

常用的类#

image-20200726102445798

image-20200726102522686

image-20200726103117333

image-20200726103243548

实现思想:#

   //1.创建 DiskFileItemFactory 对象,处理文件上传路径和大小的限制
        DiskFileItemFactory diskFileItemFactory = getDiskFileItemFactory(tmpFile);
  
   //2.获取 ServletFileUpload
    ServletFileUpload servletFileUpload = getServletFileUpload(diskFileItemFactory);
    //3. 处理上传的文件
     //每一个表单里面的标签就是一个FIleItem对象
      List<FileItem> fileItems = servletFileUpload.parseRequest(request);

文件名#

UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写。

image-20200726110209579

代码实现:#

package com.cb.test;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
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 org.junit.jupiter.api.Test;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.UUID;

public class Test1 extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //判断是带文件的表单还是不带文件的表单
        //web wind里面的吧,在得到bai上传文件之前,首先要判断客du户端zhi<form>标记的enctype属性是否是“multipart/form-data"。
        //也可以说是判断是普dao通表单,还是带文件上传的表单。文件上传的表单值不能按普通表单接收值那样直接获取。
        if(!ServletFileUpload.isMultipartContent(req)){
            return;//终止方法
        }
        //创建文件存放保存目录和临时保存目录,WEB-INF下安全,无法直接被访问
        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();
        }

        //上传文件,一般需要通过流来获取,原生req.getInputStream()
        //这里我们用apache的上传文件组件,commons- fileUpload,依赖commons-io包

        //1.创建 DiskFileItemFactory 对象,处理文件上传路径和大小的限制
        DiskFileItemFactory diskFileItemFactory = getDiskFileItemFactory(tmpFile);

        //2.获取 ServletFileUpload
        ServletFileUpload servletFileUpload = getServletFileUpload(diskFileItemFactory);
        //3. 处理上传的文件
        try {
            uploadParseRequest(servletFileUpload,req,uploadPath);
        } catch (FileUploadException e) {
            e.printStackTrace();
        }


    }

    private String uploadParseRequest(ServletFileUpload servletFileUpload,HttpServletRequest request,String uploadPath) throws FileUploadException, IOException {

        String msg = "";

        //每一个表单里面的标签就是一个FIleItem对象

        List<FileItem> fileItems = servletFileUpload.parseRequest(request);

        for (FileItem fileItem : fileItems) {
            //判断FIleItem对象是不是 带文件的标签 false代表是一个上传文件
            if (fileItem.isFormField()) {
                //字段名
                String fieldName = fileItem.getFieldName();
                //h获取值
                String value = fileItem.getString("utf-8");
                System.out.println("key:" + fieldName + "value" + value);
            } else {
                //------------------处理文件------------------//

                //------------------获取文件路径------------------//
                //获取文件名,有些浏览器带路径名,有些不带路径
                String uploadFileName = fileItem.getName();
                if (uploadFileName.trim().equals("") || uploadFileName == null) {
                    continue;
                }
                //获取文件名 /image/guti/ada.png -> ada.png
                String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
                //获取文件名后缀
                String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);
                System.out.println("文件名:" + fileName + "后缀名" + fileExtName);

                //UUID 唯一标识符
                String uuid = UUID.randomUUID().toString();

                //文件的真实路径
                String realPath = uploadPath + "/" + uuid;
                //为每一个文件创建一个对应的文件夹
                File realPathFile = new File(realPath);
                if (!realPathFile.exists()) {
                    realPathFile.mkdir();
                }

                //------------------保存文件------------------//
                //上传文件输入流
                InputStream inputStream = fileItem.getInputStream();
                //创建上传文件输出到磁盘流
                System.out.println(realPath + "/" + fileName);
                FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName);
                //定义缓存区
                byte[] buffer = new byte[1024];
                int len = 0;
                while ((len = inputStream.read(buffer)) > 0) {
                    fileOutputStream.write(buffer, 0, len);
                }
                //关闭流
                inputStream.close();
                fileOutputStream.close();

                System.out.println("文件上传成功");
                //删除临时文件
                fileItem.delete();
            }

        }

        return msg;
    }

    private ServletFileUpload getServletFileUpload(FileItemFactory diskFileItemFactory) {
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);

        //监听文件上传进度
        servletFileUpload.setProgressListener(new ProgressListener() {
            @Override
            public void update(long pBytesRead, long pContentLength, int pItems) {
                //pBytesRead 已读 pContentLength 文件大小
                System.out.println("已经上传:"+ pBytesRead + "--总大小 " + pContentLength);
            }
        });
        //处理乱码问题
        servletFileUpload.setHeaderEncoding("utf-8");
        //设置单个文件最大值
        servletFileUpload.setFileSizeMax(1024*1024*10);
//        设置总共能上传文件最大值
        servletFileUpload.setSizeMax(1024*1024*10);
        return servletFileUpload;
    }

    private DiskFileItemFactory getDiskFileItemFactory(File file) {
        //设置文件大小和 临时文件保存目录
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        diskFileItemFactory.setSizeThreshold(1024*1024);
        diskFileItemFactory.setRepository(file);

        return diskFileItemFactory;
    }


}

作者:Esofar

出处:https://www.cnblogs.com/firsthelloworld/p/13555094.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   我不想学编丿程  阅读(131)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示