文件下载
文件上传
Jakarta EE9,Web项目
项目文件结构
<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
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>
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();
}
}
}