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");
            }

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

相关推荐
浩~~1 小时前
AI-Web 靶场
java·前端·网络
MandalaO_O1 小时前
Java Web :JDBC CRUD 与前后端交互
java·前端·交互
夫礼者2 小时前
【极简监控】综合实战篇:1+1>>10 的降维打击!联动底层工具,暴力提取 SkyWalking“断头链路”
java·监控
庞轩px11 小时前
第七篇:Spring扩展点——如何优雅地介入Bean的创建流程
java·后端·spring·bean·aware·扩展点
ltl11 小时前
Q/K/V 三件套:把 Bahdanau 抽象成一个公式
后端
tongluowan00712 小时前
一个请求在Spring MVC 中是怎么流转的
java·spring·mvc
千叶风行13 小时前
Text-to-SQL 技术设计与注意事项
前端·人工智能·后端
夜郎king13 小时前
Spring AI 对接大模型开发易错点总结与实战解决办法
java·人工智能·spring
oradh13 小时前
Oracle数据库中的Java概述
java·数据库·oracle·sql基础·oracle数据库java概述