代碼如下
private String dowmLoadFile(String filename, HttpServletResponse response) {
response.addHeader("Content-Type", "application/octet-stream");
OutputStream os = null;
this.logger.error("====================需要下載的檔案名:" + filename);
String path = ftpConfig.optString("sftp.path");
String curPath = (String)UniFtpUtil.curFilePath.get();
if (!StringUtil.isEmpty(curPath)) {
path = curPath + "/";
UniFtpUtil.curFilePath.set("");
}
ChannelSftp channel = null;
try {
os = response.getOutputStream();
channel = getChannel();
Vector ls = channel.ls(path);
this.logger.error("====================服務器中共" + ls.size() + "個檔案");
if ((ls != null) && (ls.size() > 0)) {
String filenamei = "";
for (int i = 0; i < ls.size(); i++) {
ChannelSftp.LsEntry entry = (ChannelSftp.LsEntry)ls.get(i);
filenamei = entry.getFilename();
this.logger.error("====================服務器中第" + i + "個檔案檔案,名稱:" + filenamei);
if (filenamei.contains(filename)) {
filename = filenamei;
String headName = filename.substring(0, filename.lastIndexOf("."));
String tailName = filename.substring(filename.lastIndexOf("."));
response.addHeader("Content-Disposition", "attachment; filename=" + new String(headName.getBytes("gbk"), "ISO-8859-1") + tailName);
this.logger.error("====================開始下載檔案:" + path + filename);
channel.get(path + filename, os, null);
close(channel);
return filename;
}
}
this.logger.error("====================服務器中沒有匹配的檔案");
} else {
this.logger.error("====================檔案不存在====================");
throw new RuntimeException("下載失敗");
}
} catch (Exception ex) {
ex.printStackTrace();
this.logger.error("下載downFile方法出錯");
throw new RuntimeException("下載失敗");
} finally {
try {
os.close();
close(channel);
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
日志報錯
uj5u.com熱心網友回復:
有大佬來嗎?uj5u.com熱心網友回復:
從這個警告來看,意思很明確,回應以及提交給客戶端了,所以不能設定Header引數了。但是從你代碼和日志來看,確實有點奇怪。
根據你的日志來看,先是列印了你貼出代碼的第4行。
然后接下來的日志直接是代碼的41行,41行在catch里面,也就是發生例外了。那也就是說必須說上一行執行的代碼肯定在try,而且沒有列印任何日志,那從代碼來看,最多執行到第15行,因為第16行列印日志了,但是控制臺沒有,所以,應該是下面三行報錯了:
os = response.getOutputStream();
channel = getChannel();
Vector ls = channel.ls(path);
關鍵是這個os,最后再finally關閉了,也就是結束回應了。整個程序就沒有設定過任何header呀。難道是后面的其它地方設定了。
或者是說這個日志有問題?
uj5u.com熱心網友回復:
我也沒找到設定過任何header的地方,系統中還有一個方法最終也是呼叫這個,沒有報錯,但是有個就報錯了,不知道該怎么排查
uj5u.com熱心網友回復:
但是你的日志確實報錯了,檔案下載失敗了,你跟一下代碼,先把這塊看一下,看看能不能得到什么有用的資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/138051.html
標籤:Web 開發
