[Java]用servlet实现文件上传功能

由于我老婆这边需要用到文件上传,然后这任务不知道怎么就到了我头上。她的框架是比较老的struts2(说实话我一度连struts2都拼写不对。。。)

背景介绍

从毕业以来最早接触的是SpringMVC,到后面用的是SpringBoot,struts2只出现在我大学课程里面毕竟这么重的框架又都是漏洞早就已经被踢出历史洪流。
让我去回顾struts2是不可能的,接到的任务又只是完成文件上传,那么我用Servlet搞定就好了,高效便捷。

代码

引入依赖

她的项目使用到的技术栈是struts2+tomcat,没有使用maven管理依赖,所以我们也利用原始的方式,去网上下载jar包引入。
印象里面她的项目中关于上传引用的jar包是commons-fileupload-1.3.jarcommons-io-1.2.jar,所以即使有新的jar我也用了这两个比较老的jar,附上下载地址:
https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload/1.3
https://mvnrepository.com/artifact/commons-io/commons-io/1.2
在这里插入图片描述
下载完成后放入lib目录(好怀念):
在这里插入图片描述

其实从eclipse转而使用idea以来很久没有用过jar包导入依赖的形式了,所以这里还是百度了一下,这里需要这样配置:
在这里插入图片描述
在这里插入图片描述
点击+,添加导入tomcat的依赖和刚才两个jarcommons-fileupload-1.3.jarcommons-io-1.2.jar的依赖。

tomcat依赖配置

在这里插入图片描述
在这里插入图片描述

jar包依赖

在这里插入图片描述

代码编写

大致梳理一下,我们需要编写至少1个java文件1个jsp文件
为了有明显的效果,这里编写2个jsp文件,一个用来提供上传选择的界面,一个用来显示上传之后的结果。

UploadServlet

新建一个java文件:
在这里插入图片描述
源码如下:

package com.upload.service;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

public class UploadServlet extends HttpServlet {
    // 文件路径定义
    public static final String filePath = "/Users/younglu/upload";

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html; charset=UTF-8");
        // 判断提交类型是否为multipart/form-data
        boolean isMultipart = ServletFileUpload.isMultipartContent(req);
        if (isMultipart) {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload servletFileUpload = new ServletFileUpload(factory);

            // 前端传过来的三个参数 工号、姓名和文件名
            String sno = null;
            String sname = null;
            String filename = null;
            try {
                List<FileItem> items = servletFileUpload.parseRequest(req);
                Iterator<FileItem> it = items.iterator();

                // 迭代从前端获取的数据,处理表单数据和文件数据
                while (it.hasNext()) {
                    FileItem item = it.next();
                    if (item.isFormField()) {
                        if (item.getFieldName().equals("sno")) {
                            sno = item.getString("utf-8");
                        } else if (item.getFieldName().equals("sname")) {
                            sname = item.getString("utf-8");
                        } else {
                            System.out.println("其他字段,忽略。");
                        }
                    } else {
                        filename = item.getName();
                        // 文件夹不存在则创建
                        File dir = new File(filePath);
                        if (!dir.exists()) {
                            dir.mkdir();
                        } else if (dir.exists() && dir.isDirectory()){
                            System.out.println("文件夹存在,跳过新建文件夹流程!");
                        } else {
                            throw new Exception("无法创建文件夹,请确认目标路径是一个文件夹类型!");
                        }
                        File file = new File(filePath, filename);
                        item.write(file);
                        req.setAttribute("news", String.format("%s-%s : %s已上传成功,谢谢分享", sno, sname, filename));
                    }
                }
            }  catch (Exception e) {
                req.setAttribute("news", String.format("%s-%s : %s上传失败,请查看错误日志!", sno, sname, filename));
                System.out.println(String.format("文件上传失败,错误原因为:%s",e.getMessage()));
            }
            req.getRequestDispatcher("print.jsp").forward(req, resp);
        }
    }

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

配置servlet到web.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="4.0">
    <servlet>
        <servlet-name>uploadServlet</servlet-name>
        <servlet-class>com.upload.service.UploadServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>uploadServlet</servlet-name>
        <url-pattern>/upload</url-pattern>
    </servlet-mapping>
</web-app>

当请求到/upload时,将会根据http的类型调到上面的UploadServlet的doGet或者doPost方法(其实代码逻辑相同)。

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: younglu
  Date: 2021/6/22
  Time: 9:16 上午
  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="upload" method="post" enctype="multipart/form-data">
    <div>
        <h1>文件上传功能</h1>
    </div>
    <div>
        工号:<input name="sno">
    </div>
    <div>
        姓名:<input name="sname">
    </div>
    <div>
        上传文件:<input type="file" name="spicture">
    </div>
    <div>
        <input type="submit" value="上传">
    </div>
</form>
</body>
</html>

print.jsp

<%--
  Created by IntelliJ IDEA.
  User: younglu
  Date: 2021/6/22
  Time: 9:16 上午
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>文件上传结果</title>
  </head>
  <body>
    ${msg}
  </body>
</html>

效果

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值