gpt4 book ai didi

java - 从sql server获取varbinary并发送到xpages中的输出流

转载 作者:太空宇宙 更新时间:2023-11-04 13:19:55 24 4
gpt4 key购买 nike

我使用此命令将 zip 文件作为 varbinary(max) 存储在 SQL 服务器中:

INSERT INTO Cache(name,zip)
SELECT 'my_zip_file1',* FROM
OPENROWSET(BULK N'D:\folder\fol2\my_zip_file.zip', SINGLE_BLOB) AS import;

它成功地将名称和二进制数据存储在名为 Cache 的表中。

在我的 xpage 中,我有一个按钮,可以使用 render=false 发送到另一个下载页面,并向 beforeRenderResponse 事件发送 1 行代码,以便执行 java 托管 bean(即 dl.download())。

我已经成功地从托管 bean 中使用 jdbc,以便从关系数据库(例如 db2 和 sql server)获取和存储数据。

在这种特殊情况下,我想知道如何从数据库获取二进制数据?使用 rs.getBytes 或 rs.getBinaryStream ?

如何将其发送到http响应输出?下面我粘贴失败的代码:

public void download(String filepath) {
Connection con;
PreparedStatement stm;
ResultSet rs;
byte[] buf = new byte[8192];
//InputStream is = new ByteArrayInputStream(buf);
byte[] zip;
try {
Class.forName(jdbcClass);
con = DriverManager.getConnection(url);
String sql = "SELECT TOP 1 * FROM Cache where name = ?;";
stm = con.prepareStatement(sql);
stm.setString(1, "D:\\folder\\fol2\\my_zip_file.zip");
rs = stm.executeQuery();
while (rs.next()) {
zip = rs.getBytes("zip");
ByteArrayInputStream is = new ByteArrayInputStream(zip);

//System.out.println("AVAIL:"+zip.available());
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
response.setContentType("application/zip, application/octet-stream");
response.setHeader("Content-disposition", "attachment; filename=z.zip");
response.setHeader("Cache-Control", "no-cache");
ServletOutputStream sout = response.getOutputStream();

int c = 0;
//while ((c = is.read()) > 0) {
while ((c = is.read(buf, 0, buf.length)) > 0) {
//sout.write(c);
sout.write(buf, 0, c);
//sout.flush();
}

}
}
}

错误是:

cant get writer while outputstream is used.

尝试另一个版本的代码给了我错误:

output stream is closed

有什么想法吗?

PS:我已设法使其与文本文件一起使用。我从数据库获取了一个字符串,并将包含该字符串的文件发送到输出流。它是从浏览器下载的,一切正常。问题在于 zip 等二进制文件...

最佳答案

这是因为您必须关闭响应。

facesContext.responseComplete();

关于java - 从sql server获取varbinary并发送到xpages中的输出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33172147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com