Java 从sql server获取varbinary并发送到xpages中的outputstream
我使用此命令在sql server中将zip文件存储为varbinary(max):Java 从sql server获取varbinary并发送到xpages中的outputstream,java,sql-server,binary,xpages,outputstream,Java,Sql Server,Binary,Xpages,Outputstream,我使用此命令在sql server中将zip文件存储为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; 它成功地将名称和二进制数据存储在名为Cache的表中 在我的xpage中有一个按钮,它向另一个下载页面发送render=false和一行代
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
事件,以便执行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();
}
}
}
}
错误是:
使用outputstream时无法获取写入程序
尝试代码的其他版本时出现错误:
输出流已关闭
有什么想法吗
附言:我已经设法使它与一个文本文件一起工作。我从数据库中得到一个字符串,并将包含该字符串的文件发送到outputstream。它是从浏览器下载的,一切正常。问题在于二进制文件的压缩…这是因为您必须关闭响应
facesContext.responseComplete();
这是因为您必须关闭响应
facesContext.responseComplete();