jsp ftp上传下载实例
时间:2010-10-04 来源:幽哥
虽然已经实现了FTP上传,但是目前却只能上传英文路径,该问题依旧等待解决的方案
一、所需软件:
FTP服务器:ServUSetup.exe 下载地址为:http://www.rhinosoft.com/__release/ServUSetup.exe
Java FTP 库edtFTPj/Free:下载地址为:http://www.enterprisedt.com/products/edtftpj/download/edtftpj.zip
二、edtFTPj/Free实现了以下功能
1、上传指定文件夹(包括子文件和文件夹) uploadFolder(String folderName, String ftpPath)
2、下载FTP上指定的文件夹 downloadFolder(String ftppath, String outdir, String ftpdir)
3、上传指定文件夹下的所有文件到FTP指定目录下 uploadAllFilesInFolder(String folderName, String ftpPath)
4、删除指定文件夹下的所有文件(包括子文件夹里面的文件,但由于不知怎么删除目录,所以暂没有做删除目录的功能) deleteAllFilesInFolder(String ftppath, String ftpdir)
5、删除指定文件 String deleteFile(String ftpPath)
6、判断FTP上目录是否存在 isDirExist(String dirname, String[] files)
7、上传单个文件 uploadFile(String clientFileName, String ftpPath)
8、下载单个文件 downloadFile(String remoteFileName,String localFileName)
9、删除指定文件夹下的所有文件(不包括子文件夹,只是删除指定文件夹下的文件)
三、实现过程
0、安装FTP服务器,配置域名、用户名、密码以及根目录
1、连接FTP服务器
/**************************************************************************
调用该构造函数的格式为:FtpService ftp=new FtpService("127.0.0.1","21","admin","admin");
打印效果如下则表示连接服务器成功
  开始登录
  登录成功
  已转入根目录
**************************************************************************/
  view plaincopy to clipboardprint?
  /** 
       * 初始化连接 
       * @param pFtpServer FTP服务器地址 
       * @param pFtpPort FTP服务器端口 
       * @param pFtpUserName FTP登录用户名 
       * @param pFtpPassword FTP登录密码 
       * @throws IOException 
      */    
      public FtpService(String pFtpServer, String pFtpPort, String pFtpUserName,String pFtpPassword) throws Exception   
      {   
          this.ftpServer = pFtpServer;   
            if (pFtpPort.trim().equals(""))   
             this.ftpPort = "21";   
            else 
             this.ftpPort = pFtpPort;   
            if (pFtpUserName.trim().equals(""))   
             this.ftpUserName = "Anonymous";   
            else 
             this.ftpUserName = pFtpUserName;   
            this.ftpPassword = pFtpPassword;   
            try {      
                      ftpClient = new FTPClient(); //ftpServer, Integer.parseInt(ftpPort)   
                      ftpClient.setRemoteHost(ftpServer);   
                      ftpClient.setRemotePort(Integer.parseInt(ftpPort));   
                      ftpClient.setControlEncoding("gbk"); //加上这一句后在 edtftpj 2.0.1 下就可以传中文文件名了   
                      System.out.println("开始登录");   
                      ftpClient.connect();   
                      ftpClient.login(ftpUserName, ftpPassword);   
                      System.out.println("登录成功");   
                      ftpClient.chdir("\\"); //在有的ftp服务器运行会出错,用ftpClient.chdir("/")又可以了   
                      System.out.println("已转入根目录");   
                      isLogin = true;   
            } catch (Exception e) {   
             throw new Exception(e.getMessage());   
            }   
     } 
  /**
       * 初始化连接
       * @param pFtpServer FTP服务器地址
       * @param pFtpPort FTP服务器端口
       * @param pFtpUserName FTP登录用户名
       * @param pFtpPassword FTP登录密码
       * @throws IOException
      */ 
      public FtpService(String pFtpServer, String pFtpPort, String pFtpUserName,String pFtpPassword) throws Exception
      {
      this.ftpServer = pFtpServer;
         if (pFtpPort.trim().equals(""))
          this.ftpPort = "21";
         else
          this.ftpPort = pFtpPort;
         if (pFtpUserName.trim().equals(""))
          this.ftpUserName = "Anonymous";
         else
          this.ftpUserName = pFtpUserName;
         this.ftpPassword = pFtpPassword;
         try {   
                   ftpClient = new FTPClient(); //ftpServer, Integer.parseInt(ftpPort)
                   ftpClient.setRemoteHost(ftpServer);
                   ftpClient.setRemotePort(Integer.parseInt(ftpPort));
                   ftpClient.setControlEncoding("gbk"); //加上这一句后在 edtftpj 2.0.1 下就可以传中文文件名了
                   System.out.println("开始登录");
                   ftpClient.connect();
                   ftpClient.login(ftpUserName, ftpPassword);
                   System.out.println("登录成功");
                   ftpClient.chdir("\\"); //在有的ftp服务器运行会出错,用ftpClient.chdir("/")又可以了
                   System.out.println("已转入根目录");
                   isLogin = true;
         } catch (Exception e) {
          throw new Exception(e.getMessage());
         }
     }
  2、实现上传文件函数:上传指定文件夹下的所有文件到FTP指定目录下
  view plaincopy to clipboardprint?
  /** 
       * 上传指定文件夹下的所有文件到FTP指定目录下 
       * @param folderName 本地要上传的文件夹全路径 
       * @param ftpPath FTP上对于根目录的路径 
       * @throws IOException 
      */       
      public void uploadAllFilesInFolder(String folderName, String ftpPath) throws   
              Exception {   
          if (isLogin) {   
              String strMsg = "";   
              try {   
                  File file = new File(folderName);   
                  if (file.isDirectory()) {   
                      ftpClient.chdir("\\");   
                      ftpClient.setType(FTPTransferType.BINARY);   
                      if (checkFolderIsExist(ftpPath)) {   
                          ftpClient.chdir(ftpPath);   
                      } else {   
                          createFolder(ftpPath);   
                      }   
                      File[] files = file.listFiles();   
                      for (int i = 0; i < files.length; i++) {   
                          if (files[i].isFile()) {   
                              try {   
                                  ftpClient.put(files[i].getPath(),   
                                                files[i].getName());   
                              } catch (Exception ee) {   
                                  strMsg += "upload file<<:" + files[i].getPath() +   
                                          ">> error!Message:" + ee.getMessage() +   
                                          "\r\n";   
                              }   
                          }   
                      }   
                  } else {   
                      throw new Exception(folderName + " is not a folder'name!");   
                  }   
              } catch (Exception e) {   
                  throw new Exception(e.getMessage());   
              }   
          } else {   
              throw new Exception("you didnot login remote ftp server!");   
          }   
      } 
  /**
       * 上传指定文件夹下的所有文件到FTP指定目录下
       * @param folderName 本地要上传的文件夹全路径
       * @param ftpPath FTP上对于根目录的路径
       * @throws IOException
      */    
      public void uploadAllFilesInFolder(String folderName, String ftpPath) throws
              Exception {
          if (isLogin) {
              String strMsg = "";
              try {
                  File file = new File(folderName);
                  if (file.isDirectory()) {
                      ftpClient.chdir("\\");
                      ftpClient.setType(FTPTransferType.BINARY);
                      if (checkFolderIsExist(ftpPath)) {
                          ftpClient.chdir(ftpPath);
                      } else {
                          createFolder(ftpPath);
                      }
                      File[] files = file.listFiles();
                      for (int i = 0; i < files.length; i++) {
                          if (files[i].isFile()) {
                              try {
                                  ftpClient.put(files[i].getPath(),
                                                files[i].getName());
                              } catch (Exception ee) {
                                  strMsg += "upload file<<:" + files[i].getPath() +
                                          ">> error!Message:" + ee.getMessage() +
                                          "\r\n";
                              }
                          }
                      }
                  } else {
                      throw new Exception(folderName + " is not a folder'name!");
                  }
              } catch (Exception e) {
                  throw new Exception(e.getMessage());
              }
          } else {
              throw new Exception("you didnot login remote ftp server!");
          }
      }
  
  3、实现上传单个文件函数
  view plaincopy to clipboardprint?
  /** 
       * 上传单个文件 uploadFile(String clientFileName, String ftpPath) 
       * @param clientFileName 本地要上传的文件的全路径 
       * @param ftpPath FTP上对于根目录的路径 
       * @throws IOException 
      */ 
      public void uploadFile(String clientFileName, String ftpPath) throws 
              Exception {   
          if (isLogin) {   
              try {   
                  //获取文件名   
                  String filename = "";   
                  int index = clientFileName.lastIndexOf("\\");   
                  filename = clientFileName.substring(index + 1);   
                  ftpClient.chdir("\\");   
                  ftpClient.setType(FTPTransferType.BINARY);   
                  if (checkFolderIsExist(ftpPath)) {   
                      ftpClient.chdir(ftpPath);   
                  } else {   
                      createFolder(ftpPath);   
                  }   
                  ftpClient.put(clientFileName, filename);   
              } catch (Exception ex) {   
                  throw new Exception(ex.getMessage());   
              }   
          } else {   
              throw new Exception("you didnot login remote ftp server!");   
          }   
      } 
  /**
       * 上传单个文件 uploadFile(String clientFileName, String ftpPath)
       * @param clientFileName 本地要上传的文件的全路径
       * @param ftpPath FTP上对于根目录的路径
       * @throws IOException
      */
      public void uploadFile(String clientFileName, String ftpPath) throws
              Exception {
          if (isLogin) {
              try {
                  //获取文件名
                  String filename = "";
                  int index = clientFileName.lastIndexOf("\\");
                  filename = clientFileName.substring(index + 1);
                  ftpClient.chdir("\\");
                  ftpClient.setType(FTPTransferType.BINARY);
                  if (checkFolderIsExist(ftpPath)) {
                      ftpClient.chdir(ftpPath);
                  } else {
                      createFolder(ftpPath);
                  }
                  ftpClient.put(clientFileName, filename);
              } catch (Exception ex) {
                  throw new Exception(ex.getMessage());
              }
          } else {
              throw new Exception("you didnot login remote ftp server!");
          }
      }










