MavenServlet项目文件上传

目录

1.创建普通MavenWeb项目

2.引入servlet相关的依赖

3.相关准备工作

4.前端传递文件类型参数

5.后端代码

6.将文件保存在指定的目录下


这回我们需要讨论的是使用Maven的普通servlet项目的文件上传的相关方法。

1.创建普通MavenWeb项目

创建新项目:

左边选则创建Maven项目,右边勾选Creat from archetype选则webapp选项:

填写组id:

Finish:

2.引入servlet相关的依赖

我们需要引入的依赖有两类:一个是与servlet相关的依赖,另一个是与文件上传相关的依赖。

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>servlet-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <!-- Servlet 核心依赖 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>

        <!--引入两个与文件上传相关的依赖包-->
        <!-- 文件上传核心依赖 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

        <!-- IO 工具包 -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
    </dependencies>

</project>

3.相关准备工作

(1)首先创建如下目录结构作为本次实验结构:

(2)在index.jsp文件中写入前端的初始化代码:

html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传</title>
</head>
<body>

</body>
</html>

(3)创建FileSubmitServlet文件并继承HttpServlet类(鼠标放在类名上面,点击Ctrl+o并勾选doPost和doGet方法):

java 复制代码
package com.newFile.servlet;

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 FileSubmitServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

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

(4)初始化web.xml文件:

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="3.1">
    
</web-app>

(5)编写servlet映射路径(编写完映射路径后,前端就可以经参数传递给对应的路径了):

XML 复制代码
    <servlet>
        <servlet-name>FileSubmitServlet1</servlet-name>
        <servlet-class>com.newFile.servlet.FileSubmitServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FileSubmitServlet1</servlet-name>
        <url-pattern>/FileSubmit</url-pattern>
    </servlet-mapping>

4.前端传递文件类型参数

前端可以使用form表单形式将文件类型传递给后端,其中form标签中务必添加一个属性:enctype="multipart/form-data"表示将文件以二进制流的形式传递给后端。

这里第一个input类型标为file类型,第二个提交按键类型标为submit类型。

action中填写需要向后端传递的url。

html 复制代码
    <form action="/inputFile" method="post" enctype="multipart/form-data">
        <input type="file" name="inputFile" value="选则文件">
        <br><br>
        <input type="submit" value="提交文件">
    </form>

5.后端代码

我们测试就先使用doPost方法:

(1)后端首先创建创建文件保存的位置(假设我想将上传的文件保存在D:\study4\Test510中),并且我如果没有创建这个保存文件的文件夹,我需要创建一下。

java 复制代码
        String savePath = "D:\\study4\\Test510";
        File file = new File(savePath);

        if(!file.exists()){
            //如果路径不存在就创建新路径
            file.mkdirs();
        }

这里的File file = new File(savaPath);只是绑定对应文件的位置,不是创建文件。

(2)有了保存文件的位置后,我们还需要创建一个文件上传解析器,后续就可以通过upload来获取前端传来的文件信息列表:

java 复制代码
//         2. 创建文件上传解析器
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
复制代码
前提:fileItem类是前端传过来的一个数据项,不仅仅可以表示文件,也可以表示基本类型的数据,我们可以通过fileItem类来接收前端传递的文件流信息

我们可以使用.isFormField()方法判断内容是否为文件格式内容,返回true表示是文件格式的内容,false表示不是文件格式的内容。

(3)利用upload.parseRequest(req);方法类接收前端传递的文件流信息列表,并使用for循环遍历列表并打印文件信息(这里打印的是文章名+文章大小)

java 复制代码
            List<FileItem>items = upload.parseRequest(req);
            for(FileItem fi:items){
                System.out.println(fi.getName()+":"+fi.getSize());
                System.out.println("success");
            }

点击运行后选则文件,然后点击提交文件返回控制台。

控制台输出结果:

6.将文件保存在指定的目录下

复制代码
使用File类的相关构造方法在新的文件夹下创建新的文件,务必使用substring获取文件全名(某些旧版本浏览器使用getName方法不能直接返回类名)。这里使用的是第二种构造方法,通过父级目录创建子级文件。FileItem提供了一个write方法便于将文件写入到指定的File类中,底层用的也是流的形式(也可以使用字节/字符流替换这一操作,不难)。
java 复制代码
            List<FileItem>items = upload.parseRequest(req);
            for(FileItem fi:items){
                String fileName = fi.getName();
                if(fileName.contains("\\")){
                    fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
                }
                File fileC = new File(file,fileName);
                //意思就是将fi写入到新创建好的文件中去
                fi.write(fileC);
                System.out.println("success");
            }

最后运行项目就可以验证结果了

相关推荐
小程故事多_804 小时前
从初代架构到大模型时代,英伟达GPU底层架构演进与核心逻辑深度解析
java·人工智能·分布式·架构
组合缺一4 小时前
Solon 热加载与插件热插拔:Debug 模式 × E-Spi × H-Spi 全解析
java·solon·插件·plugin·热插拨
MageGojo4 小时前
Whois 域名查询 API 接入实战:用一个 GET 请求获取域名注册信息
java·git·github
MandalaO_O4 小时前
SpringMVC:框架搭建、核心配置与前后端交
java
jerryinwuhan4 小时前
marker BiBERTo解释
java·前端·人工智能
BingoGo4 小时前
改变 PHP 未来的 RFC Polling API
后端·php
程序员cxuan4 小时前
这个 6.6 k star 的仓库,我差点删库了。
人工智能·后端·程序员
在繁华处4 小时前
Java从零到熟练(八):泛型与注解
java·开发语言·python
知彼解己4 小时前
SQLite 核心实战:后端工程师视角
后端·golang·ai编程
半夜修仙4 小时前
RabbitMQ入门概述
java·rabbitmq·java-rabbitmq