使用FTPClient文件上传下载遇到的问题

由于公司的业务,需要讲ftp的文件进行定时批量的下载以及上传,先是将一百多万的文件下载之后进行一个小的编辑,然后再将文件上传上午,其中遇到了许多的问题,

为了形成一个备忘录,所以记着,或许对你们也有点帮助

 

 /**
  *
  * 从ftp中下载文件
  *
  * @param ftppath
  *            文件的路径
  * @param fawenr
  *            发文日期
  * @param tongzhislx
  *            表格代码 用于生成文件夹格式
  *
  * @return 返回的是压缩文件地址
  */

 public String downFromftpAndZip(String ftpPath, String fawenr,
   String tongzhislx) {
  File file = null;
  FTPClient client = new FTPClient();
  FileOutputStream os = null;
  String saveDir = "";
  System.out.println("ftp的下载地址为:" + ftpPath);
  if (ftpPath != null && ftpPath.length() > 0) {
   int st = ftpPath.indexOf(":");
   int index = st + 1 + ftpPath.substring(st + 1).indexOf(":");
   int ipIndex = ftpPath.indexOf("@");
   int portIndex = ftpPath.lastIndexOf(":");
   // 下载的文件存放路径
   String ftpUser = ftpPath.substring(st + 3, index); // "efs";
   // UserName
   String ftpPwd = ftpPath.substring(index + 1, ipIndex); // "efs";
   // Password
   String hostname = ftpPath.substring(ipIndex + 1, portIndex); // "10.50.161.9";//截取获得
   // host
   String str = ftpPath.substring(portIndex);
   int dirIndex = str.indexOf("/");
   int port = Integer.parseInt(ftpPath.substring(portIndex + 1,
     dirIndex + portIndex));// 21;
   saveDir = getDateFormat(fawenr);// 转为相应的时间格式
   try {
    logger.info("before connect  connect state:"
      + client.isConnected());
    client.connect(hostname, port);// 连接ftp
    logger.info("after connect" + client.isConnected());
    client.enterLocalPassiveMode();// 设置为被动模式
    boolean loginState = client.login(ftpUser, ftpPwd);// 登录ftp
    logger.info("before login" + loginState);
    // int reply = 0;
    // reply = client.getReplyCode();
    // if (!FTPReply.isPositiveCompletion(reply)) { // 
    // client.disconnect();
    // logger.error("服务器拒绝连接");
    // return null;
    //
    // }
    String tempPath = ftpPath.substring(dirIndex + portIndex);//
    logger.info("tmeppath:" + tempPath);
    // String workPath = ftpPath.substring(dirIndex + portIndex,
    // ftpPath.lastIndexOf("/"));// 获取工作空间
    String fileName = ftpPath
      .substring(ftpPath.lastIndexOf("/") + 1);// 获取文件名称
    // client.changeWorkingDirectory(workPath);// 更改工作目录
    if (!loginState) {
     logger.error(ftpUser + "登录ftp失败。。。");
     return null;
    }
    String beginPath = beginDir + saveDir + "/" + tongzhislx;// 获得保存的文件夹
    // 注:新添表格代码目录
    // 时间:6-29
    File fileDir = new File(beginPath);// 创建日期文件夹
    if (!fileDir.exists()) {// 判断文件夹是否存在
     fileDir.mkdirs();// 不存在,则做多级创建文件夹
    }
    file = new File(beginPath + "/" + fileName);// 输出文件
    if (!file.exists()) {
     file.createNewFile();
    }
    client.setBufferSize(buffere);
    client.setFileType(FTPClient.BINARY_FILE_TYPE);// 使用二进制保存方式
    FTPClientConfig conf = new FTPClientConfig(
      FTPClientConfig.SYST_UNIX);
    conf.setServerLanguageCode("zh");
    os = new FileOutputStream(file);// 文件的输出
    boolean flag = client.retrieveFile(new String(tempPath
      .getBytes("GBK"), "ISO-8859-1"), os);// 但是觉得能下载的啊
    if (!flag) {
     logger.error("文件下载失败!!!");
    }
    os.flush();
    client.logout();// 登出
   } catch (SocketException e1) {
    logger.error("端口号不存在,连接失败,错误信息为:", e1);
   } catch (IOException e1) {
    logger.error("ftp登录失败,错误信息为:", e1);
   } catch (Exception e) {
    logger.error("文件下载失败...错误信息为:", e);
   } finally {
    try {
     if (os != null) {
      os.close();
     }
     if (client != null) {
      if (client.isConnected()) {
       client.disconnect();// 取消链接
      }
     }
    } catch (IOException e) {
     logger.error("ftp文件流关闭异常", e);
    }
   }
  }
  if (file != null) {
   logger.info(file.getAbsolutePath() + "----------下载到的地点");
   return file.getAbsolutePath();

  } else {
   return null;
  }

 }

 

文件上传:

/**
  *
  * @param file
  *            上传的文件或文件夹
  * @param virtualPath
  *            文件的虚拟路径 根目录为:document
  * @throws Exception
  */
 public boolean upload(File file, String virtualPath) {
  FTPClient ftp=connect();//连接服务器 每次都进行连接以及关闭
  boolean flag = false;
  if (file.isDirectory()) {

   try {
    ftp.makeDirectory(file.getName());
    ftp.changeWorkingDirectory(file.getName());
    String[] files = file.list();
    for (int i = 0; i < files.length; i++) {
     File file1 = new File(file.getPath() + "\\" + files[i]);
     if (file1.isDirectory()) {
      upload(file1, "");
      ftp.changeToParentDirectory();
     } else {
      File file2 = new File(file.getPath() + "\\" + files[i]);
      FileInputStream input = new FileInputStream(file2);
      ftp.enterLocalPassiveMode();// 必须修改工作方式
             // port()和pasv()的工作方式
      ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
      flag = ftp.storeFile(file2.getName(), input);
      input.close();
      return flag;
     }
    }
    ftp.changeWorkingDirectory("\\");
   } catch (IOException e) {
    logger.warn("文件上传,IO异常,错误信息为:", e);
    e.printStackTrace();
    return false;
   }

  } else {
   virtualPath = virtualPath.replace("\\", "/");
   String dir[] = virtualPath.split("/");
   for (String string : dir) { // 创建多级文件夹
    // System.out.println(string);
    if (string.indexOf(".") == -1) {
     try {

      ftp.makeDirectory(string);
      ftp.changeWorkingDirectory(string);// 改变目录
     } catch (IOException e) {
      e.printStackTrace();
     }
    }
   }
   FileInputStream input = null;
   try {
    if (file != null && file.exists()) {
     input = new FileInputStream(file);
     ftp.enterLocalPassiveMode();// 必须修改工作方式 port()和pasv()的工作方式
     ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
     ftp.setBufferSize(1024);
     ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
     ftp.setControlEncoding("UTF-8");
     if (input != null) {
      flag = ftp.storeFile(file.getName(), input);
     }

     if (flag) {
      flag = true;
     } else {
      flag = false;
      System.out.println("文件上传失败");
     }

     ftp.changeWorkingDirectory("//");// 再次回到首目录
     ftp.logout();
     ftp.disconnect();
    } else {
     logger.warn("文件不存在或是不是文件");
    }

   } catch (IOException e) {
    logger.warn("文件上传有误,IO异常,错误信息为:", e);
    e.printStackTrace();
   } finally {
    if (input != null) {
     try {
      input.close();
     } catch (IOException e) {
      logger.warn("上传流关闭异常,", e);
     }

    }
   }

   return flag;
  }
  return flag;
 }

 

上面是文件下载的与上传的代码  我说明一下一些关键的代码:

1.ftp.enterLocalPassiveMode();当你文件下载异常或是中途中断的时候,就试图加上这一句话就好

2.ftp.setFileType(FTPClient.BINARY_FILE_TYPE);如果发现你的文件上传大小为0kb,或是大小不正常,这句话是必须的,尤其是在linux的服务器中

3.ftp.setControlEncoding("UTF-8");.如果你的文件名存在中文,最后加上这一句话

4. ftp.changeWorkingDirectory("//");// 再次回到首目录 

你可能感兴趣的:(总结)