JSP实现文件上传功能

下面就是使用JSP实现文件上传功能的攻略。

1. 前置准备

在进行文件上传的操作时,需要使用到Web容器提供的Servlet API和一些第三方的类库,所以在开始实现前,需要进行一些前置准备。

1.1. 导入第三方类库

上传文件过程中,需要用到Apache的常用文件上传组件commons-fileupload,所以需要下载并导入到项目中。在项目中创建一个名叫lib的文件夹(如果已经存在可以跳过),然后将下载好的commons-fileupload-1.4.jar文件复制到该文件夹下。接着,右键单击该jar包文件,选择Build Path -> Add to Build Path,即可将其导入到项目中。

1.2. 导入Servlet API

在使用Servlet时,需要导入Servlet的API包,如果使用的是Maven进行项目管理,则不需要额外导入,否则需要手动导入Servlet API包。

2. 实现文件上传

实现文件上传的关键就是通过multipart/form-data类型的POST请求提交表单,然后在Servlet中接收上传文件的InputStream对象,将其写入到磁盘中保存。

下面是通过JSP实现文件上传的步骤:

2.1. 创建文件上传页面

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data" method="post">
        <input type="file" name="file"/>
        <input type="submit" value="上传"/>
    </form>
</body>
</html>

在页面中我们使用了<form>标签提交一个multipart/form-data类型的表单,并指定了POST请求的地址和请求方法。表单中包括一个文件选择框和一个提交按钮。

2.2. 编写Servlet类处理上传请求

@WebServlet("/upload")
@MultipartConfig // 必须添加该注解
public class UploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        PrintWriter out = response.getWriter();
        try {
            Part part = request.getPart("file");
            String fileName = part.getSubmittedFileName();

            InputStream is = part.getInputStream();
            byte[] buffer = new byte[1024];
            int len;
            String filePath = "/tmp/" + fileName;
            OutputStream os = new FileOutputStream(filePath);

            while ((len = is.read(buffer)) > 0) {
                os.write(buffer, 0, len);
            }

            os.close();
            is.close();

            out.println("文件上传成功!");
            out.println("<a href='index.jsp'>返回首页</a>");
        } catch (FileNotFoundException e) {
            out.println("上传文件不存在!");
        } catch (IOException e) {
            out.println("上传文件失败!");
        }
    }
}

在该Servlet中,我们首先获得请求中的文件流,然后通过Part#getSubmittedFileName()方法获取上传的文件的原始名称,并将文件写入到磁盘中。最后通过PrintWriter对象输出上传结果。

需要注意的是,我们在Servlet类上添加了@MultipartConfig注解,来指定Servlet支持文件上传的类型和最大文件大小等必要的配置。

2.3. 测试

上传完成后,可以在磁盘上查看上传文件是否保存成功。在浏览器中打开上传页面,选择一个文件,单击“上传”按钮,上传完成后成功提示信息会显示在页面上。

3. 使用第三方类库

commons-fileupload是Apache的一个常用文件上传库,其可以方便地解析请求中的文件,并提供文件上传的处理方法。

3.1. 添加依赖

在项目的pom.xml文件中添加以下依赖:

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

3.2. 编写Servlet类处理上传请求

@WebServlet("/upload2")
public class FileUploadServlet2 extends HttpServlet {

    private static final String UPLOAD_DIRECTORY = "/tmp";

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        PrintWriter out = response.getWriter();

        // 检查是否为文件上传请求
        if (!ServletFileUpload.isMultipartContent(request)) {
            out.println("请求不支持文件上传");
            return;
        }

        // 获取上传目录路径
        String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY;
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }

        // 最大文件上传大小限制,单位为MB
        int fileSizeThreshold = 1024 * 1024 * 10;
        int maxFileSize = 1024 * 1024 * 50;

        // 配置文件上传处理器
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
        factory.setSizeThreshold(fileSizeThreshold);
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        fileUpload.setFileSizeMax(maxFileSize);

        List<FileItem> formItems = null;
        try {
            formItems = fileUpload.parseRequest(request);
        } catch (FileUploadException e) {
            out.println("文件上传失败,原因是:" + e.getMessage());
            return;
        }

        // 处理上传文件
        if (formItems != null && formItems.size() > 0) {
            for (FileItem item : formItems) {
                if (!item.isFormField()) {
                    String fileName = new File(item.getName()).getName();
                    String filePath = uploadPath + File.separator + fileName;
                    File uploadFile = new File(filePath);

                    try {
                        item.write(uploadFile);
                        out.println("文件上传成功,保存路径为:" + filePath);
                    } catch (Exception e) {
                        out.println("文件上传失败,原因是:" + e.getMessage());
                    }
                }
            }
            out.println("<a href='index.jsp'>返回首页</a>");
        } else {
            out.println("请选择上传文件!");
        }
    }
}

在该Servlet中,我们首先检查请求是否为文件上传请求,如果不是则直接返回。然后,我们通过ServletFileUpload类解析请求中的文件,并将文件写入到指定的目录中。

需要注意的是,我们在配置ServletFileUpload对象时,使用了Apache在文件上传方面提供的一些配置,比如FileSizeMax、Repository等等。

3.3. 创建文件上传页面

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/upload2" enctype="multipart/form-data" method="post">
        <input type="file" name="file"/>
        <input type="submit" value="上传"/>
    </form>
</body>
</html>

3.4. 测试

上传完成后,可以在磁盘上查看上传文件是否保存成功。在浏览器中打开上传页面,选择一个文件,单击“上传”按钮,上传完成后成功提示信息会显示在页面上。

以上就是使用JSP实现文件上传功能的完整攻略,希望可以帮助到你。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSP实现文件上传功能 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Java经典排序算法之二分插入排序详解

    Java经典排序算法之二分插入排序详解 什么是二分插入排序? 二分插入排序是插入排序的升级版,它采用二分查找来寻找插入位置,从而提高插入操作的效率。 与插入排序不同的是,插入排序是将待排序的元素插入到已排好序的序列中,找到正确的插入位置需要比较多的次数,时间效率较低。而二分插入排序是通过二分查找的方式来寻找插入的位置,可以减少比较次数,提高时间效率。 二分插…

    Java 2023年5月19日
    00
  • 判断Session的过期时间 采用JavaScript实时显示剩余多少秒

    判断Session的过期时间,一般可以采用服务器端的方法或客户端的方法,本文主要介绍采用JavaScript实时显示剩余多少秒的客户端实现方法。 准备工作 在实现过程中,需要获取Session的过期时间和当前时间,所以需要在服务器端将Session的过期时间存入到前端,可以将过期时间存入到一个隐藏域中。 代码示例: <input type="…

    Java 2023年6月15日
    00
  • 基于jenkins发布编译后的class文件

    下面是基于Jenkins发布编译后的class文件的完整攻略: 1. 安装Jenkins Jenkins是一个开源的持续集成工具,我们需要在服务器上安装Jenkins并启动它。安装Jenkins的方式有多种,可以通过下载安装包进行安装,也可以通过包管理系统进行安装。这里以Ubuntu系统为例,通过APT包管理器安装Jenkins。 在终端执行以下命令更新包索…

    Java 2023年5月26日
    00
  • 详解基于JWT的springboot权限验证技术实现

    详解基于JWT的springboot权限验证技术实现攻略 前言 本篇攻略将讲解基于JWT身份验证技术实现SpringBoot权限验证的具体流程。JWT(Json Web Token)是一种跨域身份验证方式,它将一些基本的身份信息以Json格式的数据段形式加密成一个字符串,比如在大型网站的前后端分离架构中JWT技术被广泛应用。 JWT的优势 JWT作为一种跨域…

    Java 2023年5月20日
    00
  • Java实现字符串匹配的示例代码

    下面是Java实现字符串匹配的示例代码的完整攻略: 1. 什么是字符串匹配 字符串匹配指在一个字符串中查找另一个字符串的过程。在计算机科学中,字符串匹配是十分常见的问题,例如用来搜索文本文件中的单词、在数据库中查询某些记录等等。这里我们介绍一种常见的字符串匹配算法——KMP算法。 2. KMP算法介绍 KMP算法全称是Knuth-Morris-Pratt算法…

    Java 2023年5月26日
    00
  • JAVA实现打印ascii码表代码

    下面是JAVA实现打印ASCII码表的完整攻略: 步骤一:了解ASCII码表 ASCII码(American Standard Code for Information Interchange 美国信息交换标准代码)是一种字符编码方式,使用数字127来表示128个字符(包括字母、数字和符号),它们分别对应不同的ASCII码值。了解ASCII码表对于编写打印A…

    Java 2023年5月23日
    00
  • Java long 转成 String的实现

    Java中将long类型转为String类型的方法有多种,本文将介绍两种实现。 方法一:使用String.valueOf()方法转换 String.valueOf(long value)方法可以将long类型转为String类型。例如: long num = 123456789; String str = String.valueOf(num); Syste…

    Java 2023年5月27日
    00
  • JAVA之String中删除指定字符方式(11种方法)

    JAVA字符串中删除指定字符的11种方法 在JAVA编程中,经常需要处理字符串,其中常见的操作之一就是删除指定字符。下面将介绍11种常用的删除指定字符的方法。 方法1:使用replace方法替换指定字符 可以使用String类的replace方法,将要删除的字符替换成空字符串: public static String deleteChar(String s…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部