我用這個命令存儲在SQL Server中的zip文件爲varbinary(最大值)到的OutputStream:獲取VARBINARY和發送XPages中
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
和1行代碼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();
}
}
}
}
的錯誤是:
cant get writer while outputstream is used.
試圖代碼的另一個版本給我的錯誤:
output stream is closed
任何想法?
PS:我設法使它與一個文本文件一起工作。我從數據庫中獲取了一個字符串,並將包含此字符串的文件發送到輸出流。它是從瀏覽器下載的,一切正常。問題是與二進制文件作爲zip ...