JavaWeb简单案例——文件的上传

简单介绍: 

首先获取文件上传需要的jar包,在官网中找到:Apache Commons FileUpload 和 Apache Commons IO两个jar包下载后,解压,得到两个jar包,并复制到web下面的lib目录中:

经过一段时间的学习,光外部依赖包就已经这么多了。如果使用的maven,可以之前去官网复制坐标到pom.xml文件中即可。

阿帕奇项目列表 (apache.org)

上传文件需要用到的API:

ServletFileUpload:文件上传的核心类,主要作用是判断上传的文件是否为multipart/form-data,并且将文件分段解析成单个的FileItem,方便对分段文件的操作。

FileItemFactory:将每一个单独的项目封装成DiskFileItem (FileItem接口的实现) 对象的任务,这是一个接口,在使用的时候需要使用具体的实现类,即DiskFileItemFactory。

实现文件上传的过程也非常简单,只需要:

1.下载并导入jar包

2.使用ServletFileUpload的isMultipartContent方法并传入请求对象的方式判断这个请求是否为文件上传的请求

3.创建工厂类对象,用于将每一个项目封装成单独的DiskFileItemFactory也就是FileItemFactory的具体实现类

4.创建文件上传的核心类,ServletFileUpload对象,将工厂类对象作为参数进行传递

5.通过核心类的parseRequest方法,传入一个请求对象为参数,获取到FileItem的集合,在真正进行文件的操作的时候,是使用FileItem对象进行操作

6.遍历FileItem集合,判断是普通的表单数据还是上传的文件,对于普通的表单数据,我们关注的是表单项的属性值和属性值对应的具体的值,对于上传的文件,我们关注的是属性值和文件名,并在获取到信息之后,将文件写入到输入,使用FileItem对象的write方法,参数为一个File对象,最好在构建File对象的时候将文件名添加进去

7.最后抛出异常,关闭流

上传文件使用到的方法和类:

方法简单描述
ServletFileUploadisMultipartContext判断这个请求是否为上传文件的请求,传入一个请求对象作为参数
parseRequest将文件解析为单个的FileItem对象,传入一个请求对象
FileItemifFormField判断表单请求中是文件或普通的表单数据,如果是普通的表单数据返回true,如果是文件返回false
getFieldName获取表单中的属性名
getName获取文件名
getString获取表单中的属性的值
write将传入文件写入到磁盘
DiskFileItemFactory工厂类的具体实现类,作为参数传递给上传文件的核心类

 简单案例:将表单中传入的文件写入到E盘下的photo文件夹中

Servlet类中的内容: 

package work;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
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.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;
import javax.xml.ws.WebFault;
import javax.xml.ws.WebServiceClient;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Random;

@WebServlet(name = "ServletEL" , value = "/ServletEL")
public class ServletEL extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


    }

    /**
     * 处理文件上传
     * @param req 请求对象
     * @param resp 响应对象
     * @throws ServletException Servlet异常
     * @throws IOException IO异常
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        System.out.println("文件上传成功!");
//        ServletInputStream inputStream = req.getInputStream();
//        byte[] bytes = new byte[1024];
//        int read = inputStream.read(bytes);
//        System.out.println(new String(bytes,0,read));
        /**
         *文件上传的步骤:
         * 1.首先导入需要的jar包
         * 2.判断上传的文件是否为多段的,只有多段的文件才是上传的
         *
         */
//        判断是否为上传的数据
        if(ServletFileUpload.isMultipartContent(req)){
//            创建工厂实现类
            FileItemFactory fif = new DiskFileItemFactory();
//            创建用于解析上传数据的工具类
            ServletFileUpload sfu = new ServletFileUpload(fif);
//            解析数据,获取每一个分段数据的内容
            try {
                List<FileItem> items = sfu.parseRequest(req);
                for(FileItem f : items){
                    if(f.isFormField()){
                        System.out.println("获取的表单项的name值:"+f.getFieldName());
//                        参数UTF-8解决乱码问题
                        System.out.println("获取的表单项的value值:"+f.getString("UTF-8"));
//                        System.out.println(f.getFieldName()+f.getString("UTF-8"));
                    }else {
                        System.out.println("表单项的name属性值:"+f.getFieldName());
                        System.out.println("上传的文件名:"+f.getName());
                        Random r = new Random();
                        int i = r.nextInt(10);
                        File file = new File("E:\\photo\\"+i+f.getName());
                        if(file.exists()){
                            file.delete();
                            f.write(file);
                        }else {
                            f.write(file);
                        }
//                        f.write(new File("E:\\photo\\"+i+f.getName()));
                    }
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

        }
    }

    public static void main(String[] args) throws IOException {
        File f = new File("e:\\index.txt");
        if(f.exists()){
            System.out.println(f.delete());
            System.out.println(f.createNewFile());
        }else {
            System.out.println(f.createNewFile());
        }
    }
}

 HTML提交文件页面中的内容:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: Lenovo
  Date: 2022/10/31
  Time: 11:25
  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="<c:url value="/ServletEL"/>" enctype="multipart/form-data" method="post">
    <table>
        <tr>
            <td>上传者:</td> <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>上传文件:</td> <td><input type="file" name="file"></td>
        </tr>
        <tr> <td><button type="submit">提交</button></td></tr>
    </table>
</form>
</body>
</html>

注意点:

1.关于在部署工件时报错 

如果你出现了以上的报错,说明你的lib文件没有完全的引入,你需要将你之前下载的两个jar包复制一份放在Tomcat的lib包下面

2.当你传入的文件路径不存在,即如果E盘下面不存在photo这个文件夹的时候并不会报错,而是自动创建一个photo的文件夹,并将文件写入进去,这跟File类的创建文件的参数有关

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值