• JavaWeb文件上传/下载(Servlet)


    效果

    文件下载
    在这里插入图片描述
    文件上传
    在这里插入图片描述

    项目概述

    Jakarta EE9,Web项目

    项目文件结构
    在这里插入图片描述

    0 maven依赖,资源文件

    
    <dependency>
        <groupId>org.projectlombokgroupId>
        <artifactId>lombokartifactId>
        <version>1.18.32version>
    dependency>
    
    <dependency>
        <groupId>org.mybatisgroupId>
        <artifactId>mybatisartifactId>
        <version>3.5.7version>
    dependency>
    
    <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
        <version>8.0.33version>
    dependency>
    
    <dependency>
        <groupId>commons-iogroupId>
        <artifactId>commons-ioartifactId>
        <version>2.16.1version>
    dependency>
    

    resources中准备一个文件:icon.png
    在这里插入图片描述

    1 前端页面

    index.html

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Titletitle>
    head>
    <body>
    
    <a href="file" download="icon.png">点我下载资源a>
    <hr>
    <p>先选择文件,再上传文件p>
    
    
    
    <form method="post" action="file" enctype="multipart/form-data">
        <div>
    
            <input type="file" name="test-file">
        div>
        <div>
            <button>上传文件button>
        div>
    form>
    body>
    html>
    

    2 后端程序

    FileServlet.java

    package com.example.webtest1;
    
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.MultipartConfig;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    import jakarta.servlet.http.Part;
    import org.apache.commons.io.IOUtils;
    import org.apache.ibatis.io.Resources;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    @MultipartConfig//表示该Servlet用于文件传输(文件下载-要用)
    @WebServlet("/file")
    public class FileServlet extends HttpServlet {
        int num = 1;//控制文件名,防止重复
    
        /**
         * 处理HTTP GET请求,用于下载文件。
         * 直接通过GET请求获取资源,设置响应内容类型为图像PNG,并将指定文件内容输出到响应输出流。
         *
         * @param req  HttpServletRequest对象,代表客户端的HTTP请求。
         * @param resp HttpServletResponse对象,用于向客户端发送HTTP响应。
         * @throws ServletException 如果处理请求时发生Servlet相关异常。
         * @throws IOException      如果处理请求时发生IO相关异常。
         */
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 下载文件。设置响应类型为图片PNG,从资源中获取输入流,将输入流内容复制到响应输出流
            resp.setContentType("image/png");
            InputStream inputStream = Resources.getResourceAsStream("icon.png");
            OutputStream outputStream = resp.getOutputStream();
            IOUtils.copy(inputStream, outputStream);
        }
    
    
        /**
         * 处理POST请求的方法,用于文件上传。
         *
         * @param req  HttpServletRequest对象,用于接收客户端请求。
         * @param resp HttpServletResponse对象,用于向客户端发送响应。
         * @throws ServletException 如果处理请求时发生Servlet相关异常。
         * @throws IOException      如果处理请求时发生IO相关异常。
         */
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 文件上传逻辑
            try {
                // 创建输出流,目标文件位于D:\file_test下,并根据上传文件数量自动添加文件名后缀
                try (FileOutputStream outputStream = new FileOutputStream("D:\\file_test\\test" + num++ + ".png")) {
                    // 获取请求中名为"test-file"的文件部分
                    Part part = req.getPart("test-file");
                    // 将文件内容从输入流复制到输出流
                    IOUtils.copy(part.getInputStream(), outputStream);
                    // 设置响应类型为HTML,返回上传成功的消息
                    resp.setContentType("text/html;charset=UTF-8");
                    resp.getWriter().write("文件上传成功");
                }
            } catch (IOException e) {
                // 捕获并打印IO异常
                e.printStackTrace();
            }
        }
    
    }
    
    

    参考

    https://www.itbaima.cn/document/ycpagby2v7j4p728

  • 相关阅读:
    多核处理器
    刘二大人 PyTorch深度学习实践 笔记 P1 Overview
    node插件express(路由)的插件使用(二)——body-parser和ejs插件的基本使用
    C# Linq增强扩展MoreLinq之Aggregate(对序列应用累加器)
    移动硬盘装ubuntu
    Spread.NET 16.0[Winform|WPF|ASP.NET]
    TheRouter 框架原理
    2023 牛客国庆day4 【10.2训练补题】
    华为机试 - 最大平分数组
    微信小程序常用的事件
  • 原文地址:https://blog.csdn.net/m0_63070489/article/details/138732289