gpt4 book ai didi

java - 在 Xpages 中使用 Java 下载多个文件

转载 作者:行者123 更新时间:2023-12-01 21:19:37 27 4
gpt4 key购买 nike

我在 xpage 中使用此代码从远程服务器下载文件。当用户单击 xpage 中的下载按钮时,将打开一个新的 download.xsp 页面并运行下面的代码。

#{javascript:
var exCon = facesContext.getExternalContext();
var response = exCon.getResponse();
var out = response.getOutputStream();

var zipfile = sessionScope.thezip;
var dname = zipfile.substring(zipfile.lastIndexOf("\\")+1);

dl.download(zipfile,dname);
sessionScope.thezip = null;

response.setContentType("application/zip, application/octet-stream");
response.addHeader("Content-disposition","attachment; filename="+dname);
response.setHeader("Cache-Control", "no-cache");

facesContext.responseComplete();
out.close();

Download 方法 (db.download(string,string)) 是一个 Java 方法,它作为托管 bean 引入 xpage。

public void download(String filepath, String dname){
Connection con = null;
PreparedStatement stm = null;
ResultSet rs = null;
try{
Class.forName(jdbcClass);
con = DriverManager.getConnection(url);

String insSql = "INSERT INTO Cache(name,zip) SELECT '"+filepath+"',* FROM OPENROWSET(BULK N'"+filepath+"', SINGLE_BLOB) AS import;";
stm = con.prepareStatement(insSql);
stm.executeUpdate();

String sql = "SELECT TOP 1 * FROM Cache where name = ?;";
stm = con.prepareStatement(sql);
stm.setString(1, filepath);
rs = stm.executeQuery();

while(rs.next()){
InputStream zip = rs.getBinaryStream("zip");

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="+dname);
response.setHeader("Cache-Control", "no-cache");

byte[] buf = new byte[8192];
int c = 0;

while ((c = zip.read(buf, 0, buf.length)) > 0) {
OutputStream o = response.getOutputStream();
o.write(buf, 0, c);
o.close();
}
zip.close();
}

}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(stm!=null){stm.close();}
if(rs!=null){rs.close();}
if(con!=null){con.close();}
}catch(Exception ex){ex.printStackTrace();}
}

}

此 Java 代码运行 SQL 查询以获取字节形式的 zip 文件并将其存储在表中。然后它选择该行并将字节返回给调用者 java 方法。这样我就可以获取远程文件,因为没有网络服务器可以提供 url。

我的问题是如何使用 httpResponse outputStream 来下载 2 或 3 个文件?如果我复制粘贴代码,我只会得到第一个文件。我尝试不关闭输出流,但收到错误消息,表明该流已在使用中。

有人知道吗?

P.S:上面的代码经过测试,如果我只想下载 1 个文件,则可以正常工作。

最佳答案

您最好的选择可能是使用 java.util.zip 类动态地将多个文件合并到另一个 ZIP 文件中。您可以使用 ZipOutputStream 包装输出流,然后循环遍历 ResultSet 行,创建 ZipEntry 对象来区分其中的每个文件。

关于java - 在 Xpages 中使用 Java 下载多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35869148/

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