java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题

Posted 争取过得好一点

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题相关的知识,希望对你有一定的参考价值。

//文件上传
public static boolean uploadToFTP(String url,int port,String username,String password,String path,String filename,InputStream input)
{
  boolean success=false;
  FTPClient ftp=new FTPClient();//org.apache.commons.net.ftp
  try{
    if(port>-1)
    {
      ftp.connect(url,port);  
    }else{
      ftp.connect(url);//ftp默认的端口是21
    }
    //很多人写的是用ftp.getReplyCode()给获取连接的返回值,但是这样会导致storeFileStream返回null
    if(ftp.login(username,password))
    {
      ftp.enterLocalActiveMode();
      ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
      //创建目录,如果存在会返回失败
      ftp.makeDirectory(path);
      //切换目录
      ftp.changeWorkingDirectory(path);
      //上传文件  
      //FTP协议规定文件编码格式为ISO-8859-1
      filename=new String(filename.getBytes("GBK"),"ISO-8859-1");
      OutputStream out=ftp.storeFileStream(filename);
      byte[]byteArray=new byte[4096];
      int read=0;
      while((read=input.read(byteArray))!=-1)
      {
        out.write(byteArray,0,read);
      }
      out.close();
      ftp.logout();
      sucess=true;
    }  
  }
  catch(Exception e)
  {
    
  }
  finally{
     if(ftp.isConnected())
     {
       ftp.disConnecct(); 
     }
  }
}

//文件下载
public static boolean downloadFromFTP(String url,int port,String username,String password,String path,String localpath)
{
  boolean success=false;
  FTPClient ftp=new FTPClient();//org.apache.commons.net.ftp
  try{
    int reply;
    if(port>-1)
    {
      ftp.connect(url,port);  
    }else{
      ftp.connect(url);//ftp默认的端口是21
    }
    //很多人写的是用ftp.getReplyCode()给获取连接的返回值,但是这样会导致storeFileStream返回null
    ftp.login(username,password)
        
      ftp.enterLocalActiveMode();
      ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
      reply=ftp.getReplyCode();
      if(!FTPReply.isPositionCompletion(reply))
      {
        ftp.disconnect();
        return success;s
      } 
      //切换目录  此处可以判断,切换失败就说明ftp上面没有这个路径
      ftp.changeWorkingDirectory(path);
      //上传文件  
      FTPFile[]fs=ftp.listFiles();
      OutputStream out=null;
      InputStream in=null;
      for(int i=0;i<fs.length;i++)
      {
        FTPFile ff=fs[i];
        String outFileName=ff.getName();
        //创建本地的文件时候要把编码格式转回来
        String localFileName=new String(ff.getName().getBytes("ISO-8859-"),"GBK");
        File localFile=new File(localpath+lcoalFileName);
        out=new FileOutputStream(localFile);
        in=ftp.retrieveFileStream(outFileName); 
        byte[]byteArray=new byte[4096];
        int read=0;
      while((read=in.read(byteArray))!=-1)
      {
        out.write(byteArray,0,read);
      }
      //这句很重要  要多次操作这个ftp的流的通道,要等他的每次命令完成
      ftp.completePendingCommand();
      out.flush();
      out.close();
      ftp.logout();
      sucess=true;

  }
  catch(Exception e)
  {
    
  }
  finally{
     if(ftp.isConnected())
     {
       ftp.disConnecct(); 
     }
  }
}


上面代码都在博客园编辑器手敲的可能会有些错误,上面两种方式速度都很块  比上传用storeFile   下载用retrieveFile这种方法快很多

  


以上是关于java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题的主要内容,如果未能解决你的问题,请参考以下文章

org.apache.commons.net.ftp.FTPClient下载中文文件夹乱码如何处理?

FTP上传文件名称中文乱码问题

JAVA利用commons.net.ftp.FTPClient的storeFileStream方法TXT文件上传. 已经转码UTF-16LE,上传后内容乱码

DEDECMS上面用FTP工具上传中文附件后名称是乱码 这个 怎么解决?

linux中ftp中文名乱码问题

pyftplib中文乱码问题