详解JavaWeb如何实现文件上传和下载功能

让我为您详细讲解“详解JavaWeb如何实现文件上传和下载功能”的完整攻略。

1. 文件上传功能的实现

1.1 准备工作

首先需要在web.xml中添加文件上传所需的过滤器和Servlet:

<!-- 文件上传过滤器 -->
<filter>
    <filter-name>uploadFilter</filter-name>
    <filter-class>org.apache.commons.fileupload.servlet.ServletFileUpload</filter-class>
    <init-param>
        <param-name>fileUploadThresholdSize</param-name>
        <param-value>10240</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>uploadFilter</filter-name>
    <servlet-name>uploadServlet</servlet-name>
</filter-mapping>

<!-- 文件上传Servlet -->
<servlet>
    <servlet-name>uploadServlet</servlet-name>
    <servlet-class>com.example.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>uploadServlet</servlet-name>
    <url-pattern>/upload</url-pattern>
</servlet-mapping>

还需要添加文件上传所需的依赖,比如apache-commons系列。

1.2 代码编写

接下来需要编写文件上传的Servlet类,代码如下:

@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    private static final String TMP_DIR_PATH = "/tmp";
    private static final String DESTINATION_DIR_PATH = "/uploads";

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 判断是否是文件上传表单
        if (ServletFileUpload.isMultipartContent(request)) {
            // 创建文件上传工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            factory.setSizeThreshold(1024 * 1024); // 设置缓冲区大小(默认是10KB)

            // 设置临时文件夹
            File tmpDir = new File(TMP_DIR_PATH);
            if (!tmpDir.exists()) {
                tmpDir.mkdirs();
            }
            factory.setRepository(tmpDir);

            // 创建文件上传器
            ServletFileUpload uploader = new ServletFileUpload(factory);
            uploader.setHeaderEncoding("UTF-8"); // 设置请求头编码
            uploader.setSizeMax(1024 * 1024 * 10); // 设置上传文件的最大大小(默认是1MB)

            // 设置上传文件的保存路径
            File destinationDir = new File(getServletContext().getRealPath(DESTINATION_DIR_PATH));
            if (!destinationDir.exists()) {
                destinationDir.mkdirs(); // 如果目标文件夹不存在,则创建之
            }

            try {
                // 解析Request请求
                List<FileItem> items = uploader.parseRequest(request);
                for (FileItem item : items) {
                    if (!item.isFormField()) { // 如果不是普通表单域
                        String itemName = item.getName();
                        // 保存文件(注意:需要对文件名进行处理,去掉路径等)
                        String filePath = destinationDir.getAbsolutePath() + "/" + itemName;
                        item.write(new File(filePath));
                    }
                }
                response.getWriter().write("文件上传成功!");
            } catch (Exception e) {
                response.getWriter().write("文件上传失败!" + e.getMessage());
            }
        } else {
            response.getWriter().write("不是文件上传表单!");
        }
    }
}

最后只需要编写一个上传文件的表单即可:

<form action="upload" method="POST" enctype="multipart/form-data">
    <input type="file" name="file"/>
    <input type="submit" value="上传"/>
</form>

1.3 实验验证

在项目中新建一个JSP页面,放置一个文件上传表单,上传一个文件并查看上传后文件的存储路径和文件名称是否正确。

2. 文件下载功能的实现

2.1 准备工作

和文件上传功能一样,需要在web.xml中添加文件下载所需的Servlet:

<servlet>
    <servlet-name>downloadServlet</servlet-name>
    <servlet-class>com.example.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>downloadServlet</servlet-name>
    <url-pattern>/download</url-pattern>
</servlet-mapping>

2.2 代码编写

接下来需要编写文件下载的Servlet类,代码如下:

@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
    private static final String DESTINATION_DIR_PATH = "/uploads";

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取要下载的文件名
        String fileName = request.getParameter("name");
        if (fileName == null || fileName.isEmpty()) {
            response.getWriter().write("文件名不能为空!");
            return;
        }

        // 设置文件下载ContentType
        response.setContentType("application/octet-stream");
        // 设置Content-Disposition,让浏览器下载该文件
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);

        // 获取要下载的文件路径
        String filePath = getServletContext().getRealPath(DESTINATION_DIR_PATH) + "/" + fileName;
        File file = new File(filePath);
        if (!file.exists()) {
            response.getWriter().write("文件不存在!");
            return;
        }

        // 下载文件
        FileInputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(file);
            out = response.getOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
        } catch (Exception e) {
            response.getWriter().write("文件下载失败!" + e.getMessage());
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

最后只需要在点击下载按钮时向后台发送一个GET请求,同时将文件名作为参数传递给Servlet即可:

<a href="download?name=filename">下载文件</a>

2.3 实验验证

在项目中新建一个JSP页面,放置一个文件下载按钮,下载一个已经上传的文件并查看下载后文件的名称是否正确。

以上就是“详解JavaWeb如何实现文件上传和下载功能”的完整攻略,希望可以帮助您实现这两个功能。

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

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • java连接MySQl数据库实例代码

    Java连接MySQL数据库需要以下几个步骤: 下载MySQL的Java驱动 加载驱动 建立连接 创建Statement对象 执行SQL语句 处理结果集 关闭结果集,Statement和连接 下面是一个完整的示例代码: // 加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立连接 S…

    Java 2023年6月16日
    00
  • Spark学习笔记之Spark SQL的具体使用

    Spark学习笔记之Spark SQL的具体使用 简介 Spark SQL是Spark提供的分布式SQL查询引擎,通过Spark SQL,我们可以使用SQL语法来查询非关系型数据、结构化数据、CSV文件等。Spark SQL目前支持Hive查询语法和Spark SQL语法,也允许用户进行自定义函数、聚合函数等操作。 安装 要使用Spark SQL,我们需要先…

    Java 2023年5月26日
    00
  • Java之int数组声明与初始化方式

    Java之int数组声明与初始化方式 在Java中,数组是一种特殊的数据类型,可以用来存储多个相同类型的数据。在Java中声明和初始化数组有多种方式,本文将介绍其中一种常用的方式——int数组声明与初始化方式。 声明和初始化int数组 以下是声明和初始化int数组的语法: int[] arr = new int[length]; 其中,arr是数组的名称,i…

    Java 2023年5月26日
    00
  • mybatis深入讲解resultMap的定义及用法

    MyBatis深入讲解resultMap的定义及用法 在使用MyBatis进行数据操作时,查询结果可能会被映射到Java对象中或者直接返回Map类型数据,而MyBatis提供了resultMap来帮助我们自定义查询结果的映射方式。本文将详细介绍resultMap的定义及用法。 ResultMap定义 resultMap是一个非常重要的MyBatis配置元素,…

    Java 2023年5月20日
    00
  • Java全面分析面向对象之多态

    Java全面分析面向对象之多态 什么是多态 多态是面向对象语言中非常重要的一种处理方式。它允许在程序执行时根据实际对象类型选择要调用的方法。多态的实现基于继承、接口和重写。 多态的实现 多态的实现有两种方式: 1.继承 通过继承父类,在子类中重写父类的方法,达到不同类调用同一方法返回不同结果的效果。示例如下: class Animal { void move…

    Java 2023年5月26日
    00
  • Spring Boot 整合 Apache Dubbo的示例代码

    这里给出一个完整的 Spring Boot 整合 Apache Dubbo 的示例代码攻略,包含以下内容: 环境准备 创建 Spring Boot 项目并添加依赖 配置 Dubbo 的注册中心和提供者 编写 Dubbo 的服务提供者 编写 Dubbo 的服务消费者 运行并测试示例代码 以下是具体的步骤: 1. 环境准备 首先,你需要安装并配置好以下环境: J…

    Java 2023年5月19日
    00
  • 使用Java实现5种负载均衡算法实例

    使用Java实现5种负载均衡算法的完整攻略如下: 算法简介 负载均衡是指将请求分配到多个服务器上以达到最大化利用每个服务器的目的。在实际应用中,常用的负载均衡算法有很多种,常见的有以下五种: 轮询算法:按照服务器列表中的顺序依次将请求分配到每台服务器上,然后再从头开始,循环分配请求。轮询算法适用于所有的服务器具有相同的处理能力并且请求量相差不大的情况。 随机…

    Java 2023年5月18日
    00
  • 使用cmd根据WSDL网址生成java客户端代码的实现

    使用cmd根据WSDL网址生成java客户端代码的实现,可以分为以下几个步骤: 打开cmd窗口 进入java/bin目录 敲入以下命令,其中”your_web_service_url”为你需要生成代码的WSDL服务的地址,”your_package_name”为你生成的Java代码所在的包名。 wsimport -keep -verbose your_web…

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