从 sql 服务器获取 varbinary 并发送到 xpages 中的输出流
Get varbinary from sql server and send to outputstream in xpages
我使用此命令将 zip 文件存储为 sql 服务器中的 varbinary(max):
INSERT INTO Cache(name,zip)
SELECT 'my_zip_file1',* FROM
OPENROWSET(BULK N'D:\folder\fol2\my_zip_file.zip', SINGLE_BLOB) AS import;
它成功地将名称和二进制数据存储在 table 命名缓存中。
在我的 xpage
中,我有一个按钮发送到另一个下载页面 render=false
和 1 行代码到 beforeRenderResponse
事件以执行 java托管 bean(即 dl.download()
)。
我已经设法使用来自托管 bean 的 jdbc,以便从关系数据库(例如 db2 和 sql 服务器获取和存储数据。
在这种特殊情况下,我想知道如何从数据库中获取二进制数据?使用 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();
我使用此命令将 zip 文件存储为 sql 服务器中的 varbinary(max):
INSERT INTO Cache(name,zip)
SELECT 'my_zip_file1',* FROM
OPENROWSET(BULK N'D:\folder\fol2\my_zip_file.zip', SINGLE_BLOB) AS import;
它成功地将名称和二进制数据存储在 table 命名缓存中。
在我的 xpage
中,我有一个按钮发送到另一个下载页面 render=false
和 1 行代码到 beforeRenderResponse
事件以执行 java托管 bean(即 dl.download()
)。
我已经设法使用来自托管 bean 的 jdbc,以便从关系数据库(例如 db2 和 sql 服务器获取和存储数据。
在这种特殊情况下,我想知道如何从数据库中获取二进制数据?使用 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();