javaWeb文件上传

Maven所需依赖:

        <!-- IO包依赖 -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
        <!-- 上传文件依赖 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

前端页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
<%--
  注意:上传文件必须需要写enctype="multipart/FORM-data"支持大量数据上传
       必须为post类型表示:上传文件大小没有限制
            Get类型表示:上传文件大小有限制
--%>
  <form method="post" action="upload.do" enctype="multipart/form-data">
    用户名:<input type="text" name="UserName"><br>
    上传文件:<input type="file" name="textFile"><br>
    <input type="submit">|<input type="reset">
  </form>
  </body>
</html>

配置XML

    <!-- 配置请求路径 -->
    <servlet>
        <servlet-name>FileServlet</servlet-name>
        <servlet-class>com.tang.servlet.FileServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FileServlet</servlet-name>
        <url-pattern>/upload.do</url-pattern>
    </servlet-mapping>

Servlet:

package com.example.tang;

import org.apache.commons.fileupload.FileItem;
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 java.io.*;
import java.net.URLDecoder;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        //判断上传的文件是不是多部分文件
        if (!ServletFileUpload.isMultipartContent(req)) {
            resp.getWriter().println(URLDecoder.decode("不是多部分文件!!!", "GB2312"));
            //判断如果不是多部分文件直接返回!
            return;
        }

        //创建上传文件的保存路径,建议在WEB-INF目录下用户无法直接访问
        String realPath = this.getServletContext().getRealPath("/WEB-INF/upload");//这里是获取/WEB-INF/upload目录存在电脑上的真实路径
        System.out.println("存放路径:"+realPath);
        File file = new File(realPath);
        //判断该文件是否存在如果不存在则创建
        if (!file.exists()) {
            file.mkdir();
        }

        //缓存,临时文件(如果上传的大小超过了我们的预期则把他放到临时文件里)
        String tmp = this.getServletContext().getRealPath("/WEB-INF/tmp");
        System.out.println("临时文件路径:"+tmp);
        File file1 = new File(tmp);
        if (!file1.exists()) {
            file1.mkdir();
        }

        //上传文件,通常使用流来获取可以通过req.getInputStream()来获取上传的流但十分麻烦,所以
        //可以使用Apache文件上传组件fileUpload来实现,他依赖的jar是commons-io

        try {
            //1.通过工厂设置一个缓冲区,当超过大小限制的时候把他放到缓冲区里
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();//处理文件路径或大小限制

            diskFileItemFactory.setSizeThreshold(1024 * 1024);//缓冲区大小为1M
            diskFileItemFactory.setRepository(file1);

            //2.获取ServletFileUpload
            ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
            //监听文件上传进度
            servletFileUpload.setProgressListener(new ProgressListener() {
                @Override
                public void update(long pBytesRead, long pContentLength, int pItems) {
                    System.out.println("总大小:" + pContentLength + ",已上传:" + pBytesRead);
                }
            });
            servletFileUpload.setHeaderEncoding("UTF-8");//处理编码
            servletFileUpload.setFileSizeMax(1024L * 1000024 * 10);//设置单个文件的最大值
            servletFileUpload.setSizeMax(1024L * 1020004 * 10);//设置总共能上传文件的大小

            //3.处理上传文件
            //解析请求封装成一个fileItems对象,fileItems需要从ServletFileUpload文件上传对象获取
            List<FileItem> fileItems = servletFileUpload.parseRequest(req);
            for (FileItem fileItem : fileItems) {
                //判断是不是非文件表单是为true
                if (fileItem.isFormField()){
                    String name = fileItem.getFieldName();
                    String string = fileItem.getString("UTF-8");
                    System.out.println(name+":"+string);
                }else {
                    //========== 文件处理 ============
                    String name = fileItem.getName();
                    //可能存在文件名不合法的
                    if (name==null||name.trim().equals("")){
                        continue;//文件名不合法
                    }
                    //获取上传文件名
                    String fileName = name.substring(name.lastIndexOf("/") + 1);
                    //获取上传文件后缀名
                    String fileExtName = name.substring(name.lastIndexOf(".") + 1);
                    //获取随机ID
                    String uuid = UUID.randomUUID().toString();
                    // ========== 存放地址 ============
                    File file2 = new File(realPath+"/"+uuid);
                    if (!file2.exists()){
                        file2.mkdir();
                    }
                    //========== 文件传输 ============
                    InputStream inputStream = fileItem.getInputStream();
                    //创建文件输出流
                    FileOutputStream fileOutputStream = new FileOutputStream(realPath +"/"+fileName+" "+uuid+"/"+fileName);
                    //创建一个缓冲区
                    byte[] bytes = new byte[1024 * 1024];
                    //判断是否读取完毕
                    int len=0;
                    while ((len=inputStream.read(bytes))>0){
                        fileOutputStream.write(bytes,0,len);
                    }
                    //上传成功关闭流
                    inputStream.close();
                    fileOutputStream.close();
                    //上传成功清理临时文件
                    fileItem.delete();
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }


    }
}

方法剥离:

package com.example.tang;

import org.apache.commons.fileupload.FileItem;
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 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.net.URLDecoder;
import java.util.List;
import java.util.UUID;

@WebServlet(name = "Servlet01", value = "/servlet01")
public class Servlet01 extends HttpServlet {

    //存放上传文件的路径
    private String realPath;
    //存放临时文件的对象
    private File FileTmp;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //第一步创建文件夹
        if (this.newFile(req, resp)) {
            //第二步创建工厂通过工厂设置一个缓冲区
            DiskFileItemFactory diskFileItemFactory = this.getDiskFileItemFactory();
            //第三步获取ServletFileUpload,1.传入工厂 2.设置文件大小最大值 3.设置最大尺寸
            ServletFileUpload servletFileUpload = this.getServletFileUpload(diskFileItemFactory, 1024 * 1024 * 10, 1024 * 1024 * 10);
            //第四步上传文件
            if (this.upload(servletFileUpload, req)) {
                resp.getWriter().println("文件上传成功!");
                resp.getWriter().println(" File upload succeeded!");
            } else {
                resp.getWriter().println("文件上传失败!");
                resp.getWriter().println("File upload failed!");
            }
        } else {
            resp.getWriter().println("文件夹是否创建失败...");
            resp.getWriter().println("Folder creation failed...");
        }

    }

    //创建所需要的文件夹是否创建成功
    private Boolean newFile(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //设置编码
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        //判断上传的文件是不是多部分文件
        if (!ServletFileUpload.isMultipartContent(req)) {
            resp.getWriter().println(URLDecoder.decode("不是多部分文件!!!", "GB2312"));
            //判断如果不是多部分文件直接返回!
            return false;
        }

        //创建上传文件的保存路径,建议在WEB-INF目录下用户无法直接访问
        realPath = this.getServletContext().getRealPath("/WEB-INF/upload");//这里是获取/WEB-INF/upload目录存在电脑上的真实路径
        System.out.println("存放路径:" + realPath);
        File file = new File(realPath);
        //判断该文件是否存在如果不存在则创建
        if (!file.exists()) {
            boolean mkdir = file.mkdir();
            if (!mkdir) {
                return false;
            }
        }

        //缓存,临时文件(如果上传的大小超过了我们的预期则把他放到临时文件里)
        String tmp = this.getServletContext().getRealPath("/WEB-INF/tmp");
        System.out.println("临时文件路径:" + tmp);
        FileTmp = new File(tmp);
        if (!FileTmp.exists()) {
            boolean mkdir = FileTmp.mkdir();
            if (!mkdir) {
                return false;
            }
        }
        return true;
    }

    //1.创建工厂通过工厂设置一个缓冲区,当超过大小限制的时候把他放到缓冲区里
    private DiskFileItemFactory getDiskFileItemFactory() {
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        diskFileItemFactory.setSizeThreshold(1024 * 1024);//缓冲区大小为1M
        diskFileItemFactory.setRepository(FileTmp);

        return diskFileItemFactory;
    }

    //2.获取ServletFileUpload
    private ServletFileUpload getServletFileUpload(DiskFileItemFactory diskFileItemFactory, long setFileSizeMax, long setSizeMax) {
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
        servletFileUpload.setHeaderEncoding("UTF-8");//处理编码
        servletFileUpload.setFileSizeMax(setFileSizeMax);//设置单个文件的最大值
        servletFileUpload.setSizeMax(setSizeMax);//设置总共能上传文件的大小

        //监听文件上传进度
        servletFileUpload.setProgressListener(new ProgressListener() {
            @Override
            public void update(long pBytesRead, long pContentLength, int pItems) {
                System.out.println("总大小:" + pContentLength + ",已上传:" + pBytesRead);
            }
        });
        return servletFileUpload;
    }

    //3.处理上传文件
    private Boolean upload(ServletFileUpload servletFileUpload, HttpServletRequest req) throws IOException {
        List<FileItem> fileItems = null;
        try {
            fileItems = servletFileUpload.parseRequest(req);
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
        for (FileItem fileItem : fileItems) {
            //判断是否为普通表单
            if (fileItem.isFormField()) {
                //========= 普通表单处理 ==========
                String name = fileItem.getFieldName();
                String string = fileItem.getString("UTF-8");
                System.out.println(name + ":" + string);
            } else {
                //========== 文件处理 ============
                String name = fileItem.getName();
                //可能存在文件名不合法的
                if (name == null || name.trim().equals("")) {
                    continue;//文件名不合法
                }
                //获取上传文件名
                String fileName = name.substring(name.lastIndexOf("/") + 1);//这里也可以继续获取文件夹类型的后缀名进行约束
                //获取随机ID
                String uuid = UUID.randomUUID().toString();
                // ========== 存放地址 ============
                File file2 = new File(realPath + "/" + fileName + " " + uuid);
                if (!file2.exists()) {
                    boolean mkdir = file2.mkdir();
                    if (!mkdir) {
                        return false;
                    }
                }
                //========== 文件传输 ============
                InputStream inputStream = fileItem.getInputStream();
                //创建文件输出流
                FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName + " " + uuid + "/" + fileName);
                //创建一个缓冲区
                byte[] bytes = new byte[1024 * 1024];
                //判断是否读取完毕
                int len = 0;
                while ((len = inputStream.read(bytes)) > 0) {
                    fileOutputStream.write(bytes, 0, len);
                }
                //上传成功关闭流
                inputStream.close();
                fileOutputStream.close();
                //上传成功清理临时文件
                fileItem.delete();
            }
        }
        return true;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

123小步

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

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

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

打赏作者

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

抵扣说明:

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

余额充值