多文件上传工具类,上传到tomcat上

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 文件上传工具类
 */
public class UploadFileUtile {

    public static Map<String,Object> formData = new HashMap();

    public static boolean upload(HttpServletRequest request){
        //1.创建文件上传工厂对象
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        //2.创建文件上传的组件
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
        //3.设置文件上传的编码集
        servletFileUpload.setHeaderEncoding("UTF-8");
        try {
            //整体文件最大不能超过多少 B KB 100MB
            servletFileUpload.setSizeMax(100*1024*1024);
            //单个文件最大不能超过多少
            servletFileUpload.setFileSizeMax(5*1024*1024);
            //4.获取请求对象塞入到上传组件中
            List<FileItem> fileItems = servletFileUpload.parseRequest(request);
            for (FileItem fileItem : fileItems){
                 if(fileItem.isFormField()){
                     //普通表单元素key value塞入到formData对象
                     formData.put(fileItem.getFieldName(),fileItem.getString());
                 }else{
                     InputStream is = fileItem.getInputStream();//获取文件的输入流
                     //源文件名称
                     String sourceFileName = fileItem.getName();//图片源文件名称
                     System.out.println("源文件名称:"+sourceFileName);
                     String tarGetFileName = tarGetFileName(sourceFileName);
                     System.out.println("目标文件名称:"+tarGetFileName);
                     String uploadDiskPath = request.getRealPath("/");//获取当前项目的绝对路径
                     System.out.println("获取当前项目的绝对路径"+uploadDiskPath);

//                     String resourcePath = request.getServletContext().getRealPath("/WEB-INF/Files/");
                     //创建一个输出流实现文件的上传功能
//                     D:\apache-tomcat-8.5.31\webapps\ROOT\\2024011522213600000.png
                     OutputStream os = new FileOutputStream(uploadDiskPath+File.separator+tarGetFileName);
                     System.out.println("文件路径:"+uploadDiskPath+File.separator+tarGetFileName);
                     byte[] by = new byte[1024];
                     int len;
                     while((len = is.read(by)) != -1){
                         os.write(by,0,len);
                     }

                     //讲文件名存储到session域中
                     ArrayList<String> images = (ArrayList<String>) request.getSession().getAttribute("images");
                     if (images == null || images.size() == 0){
                         images = new ArrayList<>();
                     }
                     images.add(tarGetFileName);
                     request.getSession().setAttribute("images",images);
                     os.flush();
                     os.close();
                     is.close();
                     //把相对路径的图片地址塞给formData
                     formData.put(fileItem.getFieldName(),/*relativePath+*/tarGetFileName);
                 }

            }
            //文件上传成功
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 创建文件,将相对路径返回。(上面没有用到)
     */
    public static String createUploadFilePath(String uploadDiskPath){
        String filePath = File.separator+"upload"+File.separator;
        File file = new File(uploadDiskPath+filePath);
        if(!file.exists()){//如果E没有upload目录就创建一个,有就算了
            file.mkdirs();
        }
        return filePath;
    }

    /**
     * 传入源文件名称 zxy.jpg 生成 202110291431020001.jpg(给文件重命名及限制文件后缀)
     * @param sourceFileName
     * @return
     */
    public static String tarGetFileName(String sourceFileName){
        String fileName = GenerateSequenceUtil.generateSequenceNo();//获取时间戳
        String ext = sourceFileName.substring(sourceFileName.lastIndexOf(".")); //.jpg
        //上传.jpg .png .gif
        String allowExt = ".jpg|.png|.gif|.jpeg|.docx|.pdf";//用于限制文件上传格式
        if(allowExt.lastIndexOf(ext) == -1){//未找到了
              throw new NotAllowExtException("不允许上传此类型文件");
        }
        //目标文件名称
        String tarGetFileName = fileName+ext;//例如: 202110291431020001.jpg
        return tarGetFileName;
    }


}


上传文件需要的依赖

```java
在这里插入代码片

<!--文件上传-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>


<!--servlet依赖-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

 <!--Mysql数据库JDBC依赖-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.40</version>
    </dependency>

servlet层


@WebServlet("/system/*")
public class systemServlet extends BaseServlet {
  //上传文件
    public void uploadFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println("查询职称表信息");
        R r = new R();
        boolean upload = UploadFileUtile.upload(request);
        if(upload){
            r.setData(UploadFileUtil1.formData);
            r.setCode(0);
        }

        System.out.println("多条件查询返回值给页面");
        //回写响应
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write(JSONObject.toJSONString(r));

    }
}

BaseServlet


/**
 * 由于每一次请求都要创建一个Servlet,将来会有特别多的servlet,不利于管理
 *
 * Servlet优化
 *
 * /brand/*     *代表对应的方法名
 * /user/*
 *
 * 关键点1:获取最后路径这一个方法名
 * 关键点2:通过反射以及this当前对象获取对应的字节码文件,通过invoke调用其方法完成方法的分发
 */
public class BaseServlet extends HttpServlet {
    /*
        方法的分发

        源码里是通过请求的方式来进行方法的分发,
        但我们需要通过路径名来完成对应的方法分发,因此需要重写
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取对应的请求路径
        String uri = req.getRequestURI();
        //2./brand/*  截取这个*对应的方法名
        int index = uri.lastIndexOf('/');//从后往前数的一个/对应的下标
        //  selectAll?  /selectAll?
        String methodName = uri.substring(index + 1);//这样通过打印结果得知截取的是/methodName  因此需要下标+1来截取完整方法名

        //3.执行方法
        //3.1获取对应的字节码文件 .class
        //谁调用我(this 所在的方法),我(this)代表谁
        Class<? extends BaseServlet> cls = this.getClass();  //谁是this?  BrandServlet? HttpServlet? BrandServlet?
        try {
            //通过类对象,以及方法名,定位对应的方法
            Method method = cls.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            //执行该方法,完成方法的分发
            method.invoke(this,req,resp);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值