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日

相关文章

  • SpringBoot如何使用Fastjson解析Json数据

    下面是SpringBoot使用Fastjson解析Json数据的攻略,包含以下几个部分: 添加Fastjson的依赖 编写用于解析Json数据的代码 示例 添加Fastjson的依赖 首先需要在项目的pom.xml文件中添加Fastjson的依赖,可以在官方网站中查看最新版本并添加如下代码: <dependency> <groupId&gt…

    Java 2023年5月26日
    00
  • Java中注解与原理分析详解

    下面是“Java中注解与原理分析详解”完整攻略: 简介 在Java中,注解可以用来给程序员自己的代码、库或者框架注释或标记额外信息,以便于利用这些注释或标记进行一些特殊的处理,比如代码生成、运行时检查或者其他的类型安全检测等。 注解本身就是类,只不过是一个继承了java.lang.annotation.Annotation的接口。注解的定义如下: publi…

    Java 2023年5月26日
    00
  • javaweb中mysql数据库连接步骤方法及其实例

    下面是“javaweb中mysql数据库连接步骤方法及其实例”的完整攻略。 步骤一:下载并安装MySQL 这一步很简单,直接去MySQL官网下载MySQL安装包,并按照安装向导进行安装。 步骤二:创建数据库和数据表 在安装好MySQL后,通过MySQL的客户端命令行或者图形界面工具(如Navicat等)连接MySQL并创建一个新的数据库,然后在该数据库下创建…

    Java 2023年5月19日
    00
  • Java中的传值与传引用实现过程解析

    标题:Java中的传值与传引用实现过程解析 传值 Java中的基本数据类型,如int、double等,都是通过传值的方式传递给方法或函数。传值就是将参与传递的变量的值复制一份给方法或函数使用,即在方法或函数内部修改该变量的值并不会影响到方法或函数外的变量。具体实现过程如下: 代码示例1: public class PassByValue { public s…

    Java 2023年5月26日
    00
  • Springboot使用influxDB时序数据库的实现

    接下来我将详细讲解“Springboot使用influxDB时序数据库的实现”的完整攻略。首先需要明确的是,influxDB是一个高性能的时序数据库,专门用于处理时间序列数据。而Springboot是一个基于Spring框架的应用程序快速开发框架。 引入influxDB依赖 在Springboot项目的pom.xml文件中,添加以下依赖: <depen…

    Java 2023年5月20日
    00
  • js阻止默认浏览器行为与冒泡行为的实现代码

    阻止默认浏览器行为和阻止冒泡事件是JavaScript中常用的操作。在以下的示例中,假设有一个HTML页面和一个按钮,我们将通过代码示例来演示如何阻止默认浏览器行为和阻止冒泡事件。 阻止默认浏览器行为 默认情况下,当用户点击一个链接或提交表单时,浏览器会自动执行一些动作。有时候我们需要阻止这些默认的动作,那么如何实现它呢?下面是一个实现阻止默认行为的示例代码…

    Java 2023年6月15日
    00
  • java生成随机数(字符串)示例分享

    下面是详细的完整攻略: 标题:Java生成随机数(字符串)示例分享 1. 生成随机整数 Java生成随机整数可以通过使用Java中的random类实现。以下是一个示例代码,生成一个1-100之间的随机整数: import java.util.Random; public class GenerateRandomNumber { public static v…

    Java 2023年5月27日
    00
  • R语言3.6.3安装超详细教程附安装包

    下面是详细的“R语言3.6.3安装超详细教程附安装包”的完整攻略。 准备 首先,你需要下载R语言的安装包。可以前往R官网下载对应版本的R语言安装包。 安装 双击运行下载好的R语言安装包; 选择“ Agree”同意协议; 选择安装位置; 在“Select Components”中,推荐选择默认的安装模式; 此时,“Start Menu Folder”中会出现R…

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