JavaWeb文件上传/下载(Servlet)

server/2024/12/23 6:20:37/

效果

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

项目概述

Jakarta EE9,Web项目

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

0 maven依赖,资源文件

<!--        lombok插件-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.32</version>
</dependency>
<!--        mybatis-->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version>
</dependency>
<!--        MySQL-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version>
</dependency>
<!--        commons-io库,便于处理I/O操作,如文件操作-->
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.16.1</version>
</dependency>

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

1 前端页面

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--file对应路由/file。    icon.png对应resource里的文件-->
<a href="file" download="icon.png">点我下载资源</a>
<hr>
<p>先选择文件,再上传文件</p>
<!--  method="post": 表示表单提交的方式为POST,即通过HTTP POST请求将表单数据提交到服务器。-->
<!--  action="file": 表示表单提交的目标地址为"file",即表单数据将被发送到名为"file"的处理程序或脚本。-->
<!--  enctype="multipart/form-data": 表示表单数据将以多部分/表单数据格式进行编码,这是用于包含文件上传的表单的正确MIME类型。-->
<form method="post" action="file" enctype="multipart/form-data"><div>
<!--        name对应后端的req.getPart("test-file")--><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相关异常。*/@Overrideprotected 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相关异常。*/@Overrideprotected 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


http://www.ppmy.cn/server/40404.html

相关文章

1.分布式-理论

目录 一、什么是分布式系统 二、CAP理论 1.一致性Consisency 2.可用性(Availability) 3.分区容错性(Partition tolrance) 三、BASE理论 1.Basically Available(基本可用) 2.Soft state&#xff08;软状态&#xff09; 3.Eventually consistent&#xff08;最终一致性&a…

Python 原生爬虫

Python 描述代码 描述 爬网站的页面配合正则表达式设置定时任务 仅学习参考&#xff0c;切勿使用其他用途 代码 import re import schedule import timefrom urllib.request import urlopenclass Spider:def __init__(self):# 初始化代码...pass# self.start_schedule()# 需要…

国内智能搜索工具实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

祝融传火(试水)

一段时间没写代码了&#xff0c;今天试水一道直接寄了 #include <bits/stdc.h> using namespace std; typedef long long ll; ll n, m, h, w; ll a[1010][1010]; int main() {cin >> n >> m;for (int i 1; i < n; i){for (int j 1; j < m; j){cin &…

Flutter连接websocket、实现在线聊天功能

老规矩效果图&#xff1a; 第一步&#xff1a;引入 web_socket_channel: ^2.4.0 第二步&#xff1a;封装 websocket.dart 单例 import dart:async; import dart:convert; import package:web_socket_channel/web_socket_channel.dart; import package:web_socket_channel/io…

Vue3实战笔记(07)— Axios进阶与提高

文章目录 前言一、创建自定义配置的实例二、掌握返回的结果结构三、拦截器相关用法四、异常处理相关五、取消请求的方式总结 前言 书接上文&#xff0c;目标对Axios的更多功能和特性熟练与提高。 一、创建自定义配置的实例 axios可以创建自定义配置的实例&#xff0c;可以试试…

k8s job

ReplicaSet 和 DaemonSet 会持续运行任务&#xff0c;永远达不到完成态。但在一个可完成的任务中&#xff0c;其进程终止后&#xff0c;不应该再重新启动。 Job 允许你运行一种 pod&#xff0c;该 pod 在内部进程成功结束时&#xff0c;不重启容器&#xff0c;一旦任务完成&…

C++内存管理(2)+模版初阶

目录 1.内存的划分 2.内存泄漏 3.模版初阶 &#xff08;1&#xff09;模版的引入 &#xff08;2&#xff09;函数模版 &#xff08;3&#xff09;类模版 &#xff08;4&#xff09;类型的不匹配问题 1.内存的划分 &#xff08;1&#xff09;C里面&#xff0c;把内存划分为…