21xrx.com
2025-03-24 02:26:20 Monday
文章检索 我的文章 写文章
将Java文件上传到数据库并实现下载功能
2023-06-15 09:27:49 深夜i     14     0
Java 文件上传 数据库

在日常开发中,文件上传是一个经常用到的功能。然而,常规的文件上传只是将文件存储到服务器的指定目录下,而在某些场景下,我们需要将文件上传到数据库中。本文将介绍如何使用Java实现将文件上传到MySQL数据库,并实现文件下载功能。

首先,我们需要准备一个MySQL数据库,创建一张含有文件二进制数据列(blob类型)的表。下面是数据库表的创建语句:

CREATE TABLE `file` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) NOT NULL,
 `data` blob NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

接下来,我们需要编写Java代码实现上传和下载功能。下面是上传文件的Java代码:

@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = -8259783653072183400L;
//设置上传文件的最大值,单位为字节
private static final int MAX_FILE_SIZE = 1024 * 1024 * 10;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取上传文件的名称
String fileName = request.getPart("file").getSubmittedFileName();
//获取上传文件的输入流
InputStream inputStream = request.getPart("file").getInputStream();
//创建ByteArrayOutputStream对象,将输入流的内容读入到该对象中
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
//将ByteArrayOutputStream中的内容转为byte数组
byte[] data = outputStream.toByteArray();
//获取数据库连接并将数据插入到表格中
try(Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false", "root", "password")) {
String sql = "INSERT INTO file(name, data) VALUES(?,?)";
PreparedStatement statement = conn.prepareStatement(sql);
statement.setString(1, fileName);
statement.setBytes(2, data);
statement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
//返回上传结果
response.getWriter().println("文件上传成功!");
response.getWriter().close();
}
}

接下来是下载文件的Java代码:

@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = -3872646332330568758L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取要下载文件的id
int id = Integer.parseInt(request.getParameter("id"));
//从数据库中获取文件数据
byte[] data = null;
try(Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false", "root", "password")) {
String sql = "SELECT data FROM file WHERE id=?";
PreparedStatement statement = conn.prepareStatement(sql);
statement.setInt(1, id);
ResultSet resultSet = statement.executeQuery();
if(resultSet.next()) {
data = resultSet.getBytes("data");
}
} catch (SQLException e) {
e.printStackTrace();
}
//将文件数据发送给客户端
if(data != null) {
response.setHeader("Content-Disposition", "attachment;filename=file");
response.setContentType("application/octet-stream");
response.getOutputStream().write(data);
response.getOutputStream().flush();
response.getOutputStream().close();
} else {
response.getWriter().println("文件不存在!");
response.getWriter().close();
}
}
}

经过这些步骤,我们就成功地实现了将文件上传到数据库并能够下载该文件的功能。

  
  

评论区

请求出错了