Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从sql server获取varbinary并发送到xpages中的outputstream_Java_Sql Server_Binary_Xpages_Outputstream - Fatal编程技术网

Java 从sql server获取varbinary并发送到xpages中的outputstream

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和一行代

我使用此命令在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
和一行代码到
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();