赞
踩
FtpClient同一个客户端重复使用时,第一次下载文件正常,第二次再下载文件时,总是获取不到文件信息,查找了很多文档都没有找到解决办法,偶然间搜到一篇博文说每次使用FtpClient之后,调用一次ftpClient.getReply(),消耗一个FTP链接之后,下次再使用同一个客户端连接就可以正常下载文件了。
后来增加了其他的一个Ftp服务器的连接地址之后,发现ftpClient.getReply()调用的时候一直阻塞,导致文件下载超时,所以关键代码:
int replyCode = ftpClient.getReplyCode(); if (200 == replyCode) { //消费一个连接,避免第二次获取文件为null的问题 ftpClient.getReply(); }
最终代码如下:
- /**
- * 下载该目录下当前文件名的到本地
- *
- * @param ftpPath FTP服务器上的相对路径,例如:test/123
- * @param ftpFileName 保存文件到本地的路径,例如:aaa.pdf
- * @return 成功返回true,否则返回false
- */
- public InputStream downLoadFileByName(String ftpAddress, Integer ftpPort, String ftpPath, String ftpFileName) throws Exception {
- // 登录
- FTPClient ftpClient = login(ftpAddress, ftpPort);
- String errorMsg;
- if (ftpClient != null) {
- try {
- String path = changeEncoding(ftpClient, (ftpPath.startsWith("/") ? "" : "/") + ftpPath);
- // 判断是否存在该目录
- if (!ftpClient.changeWorkingDirectory(path)) {
- errorMsg = ftpPath + DIR_NOT_EXIST;
- log.error(errorMsg);
- throw new Exception(errorMsg);
- }
- int replyCode = ftpClient.getReplyCode();
- if (200 == replyCode) {
- //消费一个连接,避免第二次获取文件为null的问题
- ftpClient.getReply();
- }
- // 判断该目录下是否有文件
- String[] fs = ftpClient.listNames(ftpFileName);
- if (fs == null || fs.length == 0) {
- errorMsg = ftpPath + DIR_CONTAINS_NO_FILE + "==fileName:" + ftpFileName;
- log.error(errorMsg);
- throw new Exception(errorMsg);
- }
- InputStream inputStream = ftpClient.retrieveFileStream(ftpFileName);
-
- return inputStream;
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- closeConnect(ftpAddress);
- throw e;
- }
- }
- return null;
- }

以上只是个人见解,如有不对的地方请各位指正,谢谢~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。