上传图片

上传图片

图片提交成功后需要在当前项目中的 out目录下才能找到提交的图片哦~~~
index.jsp有点low,但是可以满足基本需求,各位有什么好点子的话可以自行尝试的哦

当前项目的目录
本代码中有一个Bug,文件如果超过限制的大小了,异常则无法捕获,这个是Tomcat的问题,解决方案是在Tomcat目录中的找到conf文件夹,修改server.xml中的配置
修改前:

	<Connector port="8080" protocol="HTTP/1.1" 
               		connectionTimeout="20000" 
               		redirectPort="8443" />

修改后:

	<Connector port="8080" protocol="HTTP/1.1" 
               		connectionTimeout="20000" connectionUploadTimeout="36000000" disableUploadTimeout="false" maxSwallowSize="-1"
               		redirectPort="8443" />

针对上传图片的Servlet

package com.alibaba.fileload;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;

@WebServlet("/UploadFileServlet")
public class UploadFileServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
        用户文件上传位置的问题,其他用户不能直接通过 URL 获取到对应的文件,所以该文件保存在 WEB-INF下,在 WEB-INF下,创建一个 upload 目录
         */
        String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
        File file = new File(savePath);

        /*
        临时文件夹
         */
        String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
        File temp = new File(tempPath);
        // 判断对应目录是否存在
        if (!file.exists() || !file.isDirectory()) {
            // 创建对应目录
            file.mkdir();
        }

        if (!temp.exists() || !temp.isDirectory()) {
            temp.mkdir();
        }
        // 保存在操作中的异常和提示信息
        String msg = "";

        try {
            // 1、创建 DiskFileItemFactory 工厂对象
            DiskFileItemFactory factory = new DiskFileItemFactory();

            // 设置传入的最大文件字节数
            factory.setSizeThreshold(1024 * 1024 * 10);

            // 设置当前文件的保存临时目录
            factory.setRepository(temp);

            // 2、创建一个上传文件的解析器
            ServletFileUpload upload = new ServletFileUpload(factory);

            // 3、确定修改上传文件对应的解析器字符集为 utf-8
            upload.setHeaderEncoding("utf-8");

            // 设置解析器的最大文件大小
            upload.setSizeMax(1024 * 1024 * 10);

            // 设置解析器能够处理的单个最大文件大小
            upload.setFileSizeMax(1024 * 1024 * 5);

            // 4、判断在提交数据的 form 表单中,是否包含 enctype="multipart/form-data"
            if (!ServletFileUpload.isMultipartContent(request)) {
                return;
            }
            /*
            5、解析 REQUEST请求内容
            解析之后的返回值是 List<FileItem> 保存的内容都是对应的 文件元素
             */
            List<FileItem> fileItems = upload.parseRequest(request);

            for (FileItem fileItem : fileItems) {
                /*
                解析 request 请求中,存在非文件上传请求
                判断提交的数据是普通参数,非文件上传
                 */
                if (!fileItem.isFormField()) {
                    // 处理文件 获取文件的名字
                    String name = fileItem.getName();
                    String fileEName = name.substring(name.lastIndexOf(".") + 1);

                    // 判断当前获取到的文件后缀名是否符合系统要求
                    if (!"jpg|jpeg|png|gif|bmp".contains(fileEName.toLowerCase())) {
                        continue;
                    }

                    // 获取UUID文件名和对应日期的保存文件夹名
                    String fileName = makeFileName(name);

                    String fileSavePath = makeDirName(savePath);

                    File dir = new File(fileSavePath);

                    if (!dir.exists() || !dir.isDirectory()) {
                        dir.mkdir();
                    }

                    /*
                    操作 IO 流,读取文件和写入文件
                    通过 FileItem 获取上传文件的输入字节流
                     */
                    BufferedInputStream bis = new BufferedInputStream(fileItem.getInputStream());

					// 服务器读取到从浏览器提交的数据之后,保存数据到硬盘中,这里需要一个输出流
                    BufferedOutputStream bos = new BufferedOutputStream(
                            new FileOutputStream(fileSavePath + File.separatorChar + fileName));
					
					// 创建一个缓冲字节数组 4KB
                    byte[] buffer = new byte[1024 * 4];
                    int length = -1;
					
					// 从浏览器读取数据,通过缓冲流写入数据到服务器指定目录中
                    while ((length = bis.read(buffer)) != -1) {
                        bos.write(buffer, 0, length);
                    }

                    // 关闭缓冲流资源
                    bos.close();
                    bis.close();

                    // fileItem 是一个资源,需要delete
                    fileItem.delete();
                    msg = "文件上传成功";
                }
            }
            /*
            文件如果超过设定的大小,或者需要抛出其他异常,需要在tomcat修改配置文件server.xml
            修改前:
            <Connector port="8080" protocol="HTTP/1.1"
                       connectionTimeout="20000"
                       redirectPort="8443" />
            修改后:
            <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000" connectionUploadTimeout="36000000" disableUploadTimeout="false" maxSwallowSize="-1"
               redirectPort="8443" />
             */
        } catch (FileUploadBase.SizeLimitExceededException e) {
            msg = "文件总大小超出限制异常";
            e.printStackTrace();
            request.setAttribute("msg", msg);
            // 转发到 msg.jsp
            request.getRequestDispatcher("msg.jsp").forward(request, response);
            return;

        } catch (FileUploadException e) {
            msg = "文件上传失败";
            e.printStackTrace();
            request.setAttribute("msg", msg);
            // 转发到 msg.jsp
            request.getRequestDispatcher("msg.jsp").forward(request, response);
            return;

        }

        request.setAttribute("msg", msg);
        request.getRequestDispatcher("msg.jsp").forward(request, response);
    }

    /**
     * 使用 UUID 重新编写文件的名字
     * @param fileName 传入的文件名
     * @return 重新编译通过 UUID 整理之后的文件名
     */
    private String makeFileName(String fileName) {
        fileName = UUID.randomUUID().toString() + "_" + fileName.substring(fileName.lastIndexOf("."));
        return fileName.replaceAll("-", "");
    }

    /**
     * 根据传入的保存文件夹的根目录,获取对应当前日期的文件夹完整的路径,用于创建
     * @param savePath 保存文件夹的根目录
     * @return  当前日期保存文件的 String 类型绝对路径
     */
    private String makeDirName (String savePath) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
        String date = simpleDateFormat.format(new Date());

        return savePath + File.separatorChar + date;
    }
}

上传图片对应的 index.jsp

<%--
  Created by IntelliJ IDEA.
  Date: 2019/7/2
  Time: 9:45
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>文件上传</title>
  </head>
  <body>
  <form action="UploadFileServlet" method="post" enctype="multipart/form-data">
    Name: <input type="text" name="username" placeholder="请输入姓名" /> <br>
    FileOne: <input type="file" name="file1" /> <br>
    FileTwo: <input type="file" name="file2" /> <br>
    <input type="submit" value="提交"/>
  </form>
  </body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值