21xrx.com
2024-09-17 03:32:36 Tuesday
登录
文章检索 我的文章 写文章
将Java文件上传到数据库并实现下载功能
2023-06-15 09:27:49 深夜i     --     --
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();

}

}

}

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

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复