由于js中标签无法直接访问ftp地址,所以需要实现下载ftp文件到静态文件目录并重定向至静态文件,现总结如下:
/*
* TODO 下载展示ftp上的文件
* @param dir 文件所在文件夹
* @param fileName 文件名
*/
public void downloadFTPFile(String dir,String fileName){
String host="http://" + request.getLocalAddr() + ":" + request.getLocalPort() + "/msweb/file/";
// 获取存放静态文件的目录
String localPath = request.getSession().getServletContext().getRealPath("file") + "\\" + dir;
Path filePath = FileSystems.getDefault().getPath(localPath, fileName);
InputStream is = null;
try {
// 如果目标文件存在,直接返回静态文件路径
if (!filePath.toFile().exists()) {
// 目标不存在,判断目标文件夹是否存在并创建
File dirFile = new File(localPath);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
ftpClient = new FTPClient();
if (config.FTP_SERVER_PORT == 0) {
logger.debug("Connect to FTP server on " + config.FTP_SERVER_IP + ":" + FTP.DEFAULT_PORT);
ftpClient.connect(config.FTP_SERVER_IP);
} else {
logger.debug("Connect to FTP server on " + config.FTP_SERVER_IP + ":" + config.FTP_SERVER_PORT);
ftpClient.connect(config.FTP_SERVER_IP, config.FTP_SERVER_PORT);
}
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
logger.error("FTP server refuses connection");
}
logger.debug("Log in FTP server with username = " + config.FTP_USER_NAME + ", password = "
+ config.FTP_PASSWORD);
if (!ftpClient.login(config.FTP_USER_NAME, config.FTP_PASSWORD)) {
logger.error("Fail to log in FTP server with username = " + config.FTP_USER_NAME + ", password = "
+ config.FTP_PASSWORD);
ftpClient.logout();
}
String workingDirectory = "/";
if (!StringUtils.isBlank(config.FTP_WORKING_DIRECTORY)) {
workingDirectory = config.FTP_WORKING_DIRECTORY + "/" + dir + "/";
}
logger.debug("Change current working directory to " + workingDirectory);
ftpClient.changeWorkingDirectory(workingDirectory);
is = ftpClient.retrieveFileStream(fileName);
Files.copy(is, filePath);
}
} catch (Exception e) {
logger.error(e);
}
finally {
try {
if (ftpClient.isConnected()) {
ftpClient.disconnect();
}
if (is != null) {
is.close();
}
response.sendRedirect(host+dir+"/"+ fileName);
} catch (IOException f) {
}
}
}