java spring blob 附件 下载

举报
8181暴风雪 发表于 2025/01/21 20:00:38 2025/01/21
【摘要】 在Java Spring框架中,下载Blob类型的附件通常涉及以下几个步骤:从数据库中获取Blob对象。设置响应的HTTP头部,以便浏览器能够识别为下载操作。将Blob对象的内容写入HTTP响应。以下是一个简单的示例,展示了如何在Spring MVC控制器中实现下载Blob附件的功能:import org.springframework.stereotype.Controller;impor...

在Java Spring框架中,下载Blob类型的附件通常涉及以下几个步骤:

  1. 从数据库中获取Blob对象。
  2. 设置响应的HTTP头部,以便浏览器能够识别为下载操作。
  3. 将Blob对象的内容写入HTTP响应。

以下是一个简单的示例,展示了如何在Spring MVC控制器中实现下载Blob附件的功能:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

@Controller
public class FileDownloadController {

    // 假设你有一个方法来获取数据库连接
    private Connection getConnection() {
        // 这里应该返回数据库连接
        // 例如: return DriverManager.getConnection(url, username, password);
        return null;
    }

    @GetMapping("/download/{fileId}")
    public void downloadFile(@PathVariable("fileId") Long fileId, HttpServletResponse response) {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            String sql = "SELECT file_content, file_name FROM your_table WHERE id = ?";
            stmt = conn.prepareStatement(sql);
            stmt.setLong(1, fileId);
            rs = stmt.executeQuery();

            if (rs.next()) {
                Blob blob = rs.getBlob("file_content");
                String fileName = rs.getString("file_name");

                response.setContentType("application/octet-stream");
                response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
                response.setHeader("Pragma", "no-cache");
                response.setHeader("Cache-Control", "no-cache");
                response.setContentLength((int) blob.length());

                InputStream inputStream = blob.getBinaryStream();
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    response.getOutputStream().write(buffer, 0, bytesRead);
                }
                inputStream.close();
            }
        } catch (Exception e) {
            // 处理异常
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (rs != null) rs.close();
                if (stmt != null) stmt.close();
                if (conn != null) conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

这个示例中的​​FileDownloadController​​​类包含一个​​downloadFile​​​方法,该方法处理以​​/download/{fileId}​​路径的GET请求。它从数据库中检索文件内容(Blob)和文件名,然后设置适当的响应头部,最后将文件内容写入响应流。


请注意,你需要根据你的数据库表结构和字段来调整SQL查询语句。同时,确保正确处理数据库连接和异常。

此外,这个示例没有涉及事务管理,你可能需要根据实际情况添加事务控制。如果你的项目使用了Spring Data JPA或其他ORM框架,获取Blob和文件名的方式可能会有所不同,但基本的响应设置和文件流处理逻辑是类似的。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。