javaweb上传文件

  • 上传jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--注意 get提交方式;文件大小有限制--%>
<form action="${pageContext.request.contextPath}/upload.do"  enctype="multipart/form-data" method="post">
    上传者:<input type="text" name="user">
    <div><input type="file" name="myFile0"></div>
    <div><input type="file" name="myFile1"></div>
    <input type="submit" value="上传提交">
    <input type="reset" value="重置页面">
</form>
</body>
</html>
  • 上传完成提示jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
提示信息===>${message}
</body>
</html>
  • 上传代码
package com.beijing.servlet.File;

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.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.List;
import java.util.UUID;

public class FileUploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.upload(req, resp);
    }

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

    private void upload(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {

        //首先判断表单是否为 ==>上传文件的表单;
        if (!ServletFileUpload.isMultipartContent(req)) {
            //普通表单=>终止方法;
            return;
        }
        String message = null;

        try {
            //带文件的表单;
            //创建上传文件的最终保存地址;
            String uploadPath = this.getServletContext().getRealPath("WEB-INF/upload");
            //拿到上传文件时;若保存地址不存在就去创建保存目录;
            File uploadFile = new File(uploadPath);
            if (!uploadFile.exists()) {
                //创建目录;
                uploadFile.mkdir();
            }

            //使用缓存; 当文件过大时;先存为临时文件;
            String tempPath = this.getServletContext().getRealPath("WEB-INF/temp");
            //拿到上传文件时;若保存地址不存在就去创建保存目录;
            File tempFile = new File(tempPath);
            if (!tempFile.exists()) {
                //创建目录;
                tempFile.mkdir();
            }

//      先创建DiskFileItemFactory对象:
//      将请求消息实体中的每一个项目封装成单独的DiskFileItem (FileItem接口的实现) 对象的任务
//      由 org.apache.commons.fileupload.FileItemFactory 接口的默认实现
//      org.apache.commons.fileupload.disk.DiskFileItemFactory 来完成。
//      当上传的文件项目比较小时,直接保存在内存中(速度比较快),
//      比较大时,以临时文件的形式,保存在磁盘临时文件夹(虽然速度慢些,但是内存资源是有限的)。
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
            //设置缓冲区大小为 1M;
            diskFileItemFactory.setSizeThreshold(1024 * 1024);
            //临时文件保存目录;
            diskFileItemFactory.setRepository(tempFile);

            //获取ServletFileUpload对象============================================>>>
            //作用是处理上传文件数据,将表单的每一项输入封装为Fileltem对象;
            ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);

            //匿名内部类重写方法,类似
//        new Thread() {
//            @Override
//            public void run() {
//                super.run();
//            }
//        };
            //监听文件上传进度;设置上下文监听器
            servletFileUpload.setProgressListener(new ProgressListener() {
                //l:已读取的文件大小; l1:文件大小
                @Override
                public void update(long l, long l1, int i) {
                    System.out.println("文件总大小==>" + l1 + " -已经上传==>" + l);
                    double dl = Double.parseDouble(new Long(l).toString());
                    double dl1 = Double.parseDouble(new Long(l1).toString());
                    System.out.println("文件已经上传==>" + (double)(Math.round(dl/dl1*1000))/10 + "%");
                }
            });

            //处理文件乱码;
            servletFileUpload.setHeaderEncoding("utf-8");
            //设置单个文件最大值; 3M
            servletFileUpload.setFileSizeMax(3 * 1024 * 1024);
            //设置总大小; 100M
            servletFileUpload.setSizeMax(100 * 1024 * 1024);


            //处理上传的文件;============================================>>>
            //前端请求解析; 封装为fileItem对象
            List<FileItem> fileItems = servletFileUpload.parseRequest(req);
            for (FileItem fileItem : fileItems) {
                //判断是输入框还是上传文件的;
                //注意这个方法: 当返回 false 时才是文件类型的;
                if (fileItem.isFormField()) {
                    //获取其他标签框的name;
                    String name = fileItem.getName();
                    //处理乱码问题;(统一编码)
                    String value = fileItem.getString("utf-8");
                    System.out.println(name + "<--->" + value);
                } else {
                    //获取文件名;
                    String uploadName = fileItem.getName();
                    System.out.println("注意上传的文件名==>" + uploadName);

                    //对空文件名进行限制拦截;
                    if (uploadName == null || uploadName.trim().equals("")) {
                        continue;
                    }

                    //输入文件的名字;与后缀名;
                    String realName = uploadName.substring(uploadName.lastIndexOf("/") + 1);
                    String nameSuffix = uploadName.substring(uploadName.lastIndexOf(".") + 1);

                    System.out.println("实际文件名==>" + realName + "后缀文件类型=>" + nameSuffix);

                    //使用UUID生成的随机通用码保证文件唯一性;
                    String uploadFileID = UUID.randomUUID().toString();

                    //文件的存放地址问题============================================>>>
                    //文件真实地址加上uuid的通用码;
                    String realPath = uploadPath + "/" + uploadFileID;
                    //tomcat的webapps下
                    //D:\java\software\tool\apache-tomcat-9.0.37\webapps\smbms\WEB-INF\upload\4a6ea5b3-81b6-4a30-b296-453403d97397
                    File realFile = new File(realPath);
                    if (!realFile.exists()) {
                        //创建目录;
                        realFile.mkdir();
                    }

                    //文件传输==>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>流的方式;
                    //以输入流的形式从fileItem中读取出来
                    InputStream inputStream = fileItem.getInputStream();
                    //输出流;
                    FileOutputStream out = new FileOutputStream(realPath + "/" + realName);
                    //创建传输的缓冲区;
                    byte[] bytes = new byte[1024];
                    int len = 0;
                    while ((len = inputStream.read(bytes)) > 0) {
                        out.write(bytes, 0, len);
                    }
                    //关闭;释放资源;
                    out.close();
                    inputStream.close();
                    message = "<==上传成功==>";
                    //清除临时文件;
                    fileItem.delete();
                }
            }
        } catch (FileUploadException e) {
            message = "失败!!!";
            e.printStackTrace();
        }

        //转发消息;
        req.setAttribute("message",message);
        req.getRequestDispatcher("jsp/file/fileUploadInfo.jsp").forward(req,resp);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值