ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

把前端form表单里选中的文件(图片)上传到服务器

2021-11-24 14:33:27  阅读:127  来源: 互联网

标签:String form UploadException req commons 表单 import 服务器 servlet


要用到的FileUpload组件

Apache FileUpload组件

maven路径

<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>

前端jsp页面

注:form表单的methodenctype的值要注意

  • method="post"
  • enctype="multipart/form-data"
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传到服务器</title>
</head>
<body>
  <form action="${pageContext.servletContext.contextPath}/fileUpload" method="post" enctype="multipart/form-data">
    账号:<input type="text" name="userName"/><br>
    密码:<input type="password" name="pwd"/><br>
    头像:<input type="file" name="file"/><span>${errorMsg}</span><br>
    <input type="submit" value="注册">
  </form>
</body>
</html>

自己封装的文件(图片)上传工具类

import com.feng.Exception.UploadException;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

public class MyFileUtil {

    //  设置允许接收的文件的格式
    private static final String ALLWED_IMAGE_TYPE = "png,jpg,gif,jpeg";    // 这里设置为只能是图片

    public static void frontToServerUpload(HttpServletRequest req) {
        //解析和检查请求,是否是post方式,默认是二进制流格式
        Boolean isMultipart = ServletFileUpload.isMultipartContent(req);
        if (!isMultipart) {
            return; //如果不是就不用上传了
        }
        try {
            //创建FileItemFactory对象
            FileItemFactory factory = new DiskFileItemFactory();
            //设置缓存区大小,默认大小是10kb,
            ((DiskFileItemFactory) factory).setSizeThreshold(20 * 1024);// 单位b
            //设置临时目录,默认是Tomcat下的temp,不建议设置
            //((DiskFileItemFactory) factory).setRepository(临时目录不建议修改);

            //创建文件上传的处理器
            ServletFileUpload upload = new ServletFileUpload(factory);
            //解析请求
            List<FileItem> items = upload.parseRequest(req);
            //迭代出每一个FileItem
            for (FileItem item : items) {
                // 获取form表单里控件的name值
                String fileName = item.getFieldName();
                if (item.isFormField()) {
                    //普通的表单控件

                    //获取表单控件的value值
                    String value = item.getString("utf-8");
                } else {
                    //file类型的表单控件

                    //----------------先获取上传文件的拓展名
                    /*
                        item.getName()获取文件名
                        FilenameUtils.getExtension(String filename);获取文件后缀
                     */
                    String ext = FilenameUtils.getExtension(item.getName());
                    //把ALLWED_IMAGE_TYPE里的字符串通过","分割成一个字符串数组
                    String[] allowedImagetype = ALLWED_IMAGE_TYPE.split(",");
                    //-----------------判断上传文件的拓展名在不在设定的范围之内,不在的话抛出提醒并且结束方法
                    if (!Arrays.asList(allowedImagetype).contains(ext)) {
                        throw new UploadException("你上传的不是图片,请重新上传图片");
                    }
                    //上传文件的控件

                    //用UUID随机得到一个文件名
                    String RandomName = UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(item.getName());
                    //获取存放路径
                    String path = req.getSession().getServletContext().getRealPath("/upload");
                    System.out.println(path);
                    //判断文件夹是否存在,不在则创建
                    if(!new File(path).exists()){
                        new File(path).mkdirs();
                    }

                    item.write(new File(path, RandomName)); //把上传的文件保存到某个文件中
                    //System.out.println(item.isInMemory());//判断文件资源是否在内存中
                }
            }
        }
        //Exception会捕捉上方抛出的UploadException异常提示,便于把异常信息返回给Servlet
        catch (UploadException e) {
            throw e;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

自编写的文件异常类

用于servlet和和文件工具类的通信。

public class UploadException extends RuntimeException{

    /**
     *
     * @param message 异常的信息,可以自定义的
     */
    public UploadException(String message) {
        super(message);
    }

    /**
     *
     * @param message 异常的信息
     * @param cause   异常的根本原因
     */
    public UploadException(String message, Throwable cause) {
        super(message, cause);
    }
}

文件上传servlet

import com.feng.Exception.UploadException;
import com.feng.Util.MyFileUtil;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class FileUploadServlet 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 {
        try {
            System.out.println(req.getSession().getServletContext().getRealPath("/asdf"));

            System.out.println("============测试0");
            MyFileUtil.frontToServerUpload(req);
        }catch (UploadException e){
            //拿到我们自己编写的的UploadException异常信息
            String Msg=e.getMessage();
            //把异常信息传给前端
            req.setAttribute("errorMsg",Msg);
            //请求转发到要跳转的页面
            req.getRequestDispatcher("/jsp/file_to_server.jsp").forward(req,resp);
        }

    }
}

web.xml文件设置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>FileUpload</servlet-name>
        <servlet-class>com.feng.servlet.FileUploadServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FileUpload</servlet-name>
        <url-pattern>/fileUpload</url-pattern>
    </servlet-mapping>
</web-app>

转载自

标签:String,form,UploadException,req,commons,表单,import,服务器,servlet
来源: https://www.cnblogs.com/FengMoStudy/p/15597938.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有