FTP文件批量上传失败问题总结

为了实现大文件上传,采用了FTP上传的模式,与百度的UEditor结合使用,支持文件的批量上传,但是实现后,发现单个上传文件没问题,选择批量上传总有部分文件上传失败。经过排查终于发现问题,是创建FTP连接的问题,问题代码如下:

 //FTPUtils类成员变量
 public static FTPClient ftpClient = null;
 private transient static Logger log = LoggerFactory.getLogger(FtpUtils.class);
 //获取ftp连接方法
 public static void initFtpClient() throws Exception {
  int port = 21;
  String host = ScanUtil.queryCszByCsbh("FTP_HOST");//获取主机方法
  String portStr = ScanUtil.queryCszByCsbh("FTP_PORT");//获取端口方法
  String username = ScanUtil.queryCszByCsbh("FTP_USERNAME");//获取ftp用户名
  String password = ScanUtil.queryCszByCsbh("FTP_PASSWORD");//获取ftp密码
  ftpClient = new FTPClient();
  ftpClient.setControlEncoding("utf-8");
  try {
   if (null != portStr && !"".equals(portStr)) {
    port = Integer.valueOf(portStr);
   }
   ftpClient.connect(host, port); // 连接ftp服务器
   ftpClient.login(username, password); // 登录ftp服务器
   int replyCode = ftpClient.getReplyCode(); // 是否成功登录服务器
   if (!FTPReply.isPositiveCompletion(replyCode)) {
    ftpClient.disconnect();
    log.info("ftp服务器连接失败:" + host + ":" + port);
   } else {
    log.info("ftp服务器连接成功:" + host + ":" + port);
   }
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 

该段代码也是网上copy的问题在于静态成员变量ftpClient,每次上传都会更新该成员变量,该类上传、下载、删除、一级创建ftp文件夹等都用该成员变量。后改为所有的上传、下载、删除等自己获取FTPClient对象,不在使用成员变量的方式,每次操作,都单独获取一次该对象,代码如下:

 //获取FTP连接对象
 public static FTPClient getFtpCilent() throws Exception {
  int port = 21;
  String host = ScanUtil.queryCszByCsbh("FTP_HOST");
  String portStr = ScanUtil.queryCszByCsbh("FTP_PORT");
  String username = ScanUtil.queryCszByCsbh("FTP_USERNAME");
  String password = ScanUtil.queryCszByCsbh("FTP_PASSWORD");
  FTPClient ftpClient = new FTPClient();
  try {
   ftpClient.setControlEncoding("utf-8");
   if (null != portStr && !"".equals(portStr)) {
    port = Integer.valueOf(portStr);
   }
   ftpClient.connect(host, port); // 连接FTP服务器
   ftpClient.login(username, password); // 登录FTP服务器
   int replyCode = ftpClient.getReplyCode(); // 是否成功登录服务器
   if (!FTPReply.isPositiveCompletion(replyCode)) {
    ftpClient.disconnect();
    log.info("ftp服务器连接失败:" + host + ":" + port);
   } else {
    log.info("ftp服务器连接成功:" + host + ":" + port);
   }
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return ftpClient;
 }

 /**
  * 上传文件
  *
  * @param pathname
  *            ftp服务保存地址
  * @param fileName
  *            上传到ftp的文件名
  * @param inputStream
  *            输入文件流
  * @return
  */
 public static boolean uploadFile(String pathname, String fileName,
   InputStream inputStream)throws Exception {
  boolean flag = false;
  FTPClient ftpClient = null;
  try {
   ftpClient=getFtpCilent();
   ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
   // 创建目录
   createDirecroty(ftpClient,pathname);
   ftpClient.makeDirectory(pathname);
   ftpClient.changeWorkingDirectory(pathname);
   ftpClient.storeFile(fileName, inputStream);
   // 关闭退出登录
   inputStream.close();
   flag = true;
  } catch (Exception e) {
   log.info("上传文件失败!");
   e.printStackTrace();
  } finally {
   if (null != inputStream) {
    inputStream.close();
   }
   if (null != ftpClient) {
    ftpClient.disconnect();
   }
  }
  return flag;
 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值