分别使用 jdk7 和commons-net 3.5 编写ftp 文件上传功能

最近使用java 写一个ftp上传文件的功能,发现 commons-net 3.5  中ftp客户端,在jdk7(jdk1.0.79)下面报:

java.net.SocketException: Software caused connection abort: socket write error
 at java.net.SocketOutputStream.socketWrite0(Native Method)
 at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
 at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
 at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
 at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
 at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)
 at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
 at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
 at java.io.BufferedWriter.flush(BufferedWriter.java:254)
 at org.apache.commons.net.ftp.FTP.__send(FTP.java:525)
 at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:499)
 at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:628)
 at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:602)
 at org.apache.commons.net.ftp.FTP.quit(FTP.java:884)
 at org.apache.commons.net.ftp.FTPClient.logout(FTPClient.java:1152)
 at com.aebiz.bas.util.ftp.FtpUtil.close(FtpUtil.java:149)
 at com.aebiz.bas.util.ftp.FtpUtil.ftp(FtpUtil.java:136)
 at com.aebiz.bas.util.ftp.FtpUtil.main(FtpUtil.java:188)

但是在jdk6下面可以正常工作。

我门生产系使用的jdk7,只好用jdk7 自带的客户端,编写ftp 的上传功能了。

使用commons-net 3.5   编写代码如下:

package com.aebiz.bas.util.ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import com.aebiz.pub.logs.PubLogs;
import com.aebiz.pub.util.DateUtil;
import com.aebiz.pub.util.StringUtil;
/**
 * ftp 工具类
 * apache 支持jdk6,不支持 jdk7
 * @author dell
 *
 */
public class FtpUtil {
 //超时时间
 private static final int FTP_TIME_OUT = 5000000;
 private static FTPClient ftp;
    /**
     * 连接ftp 服务器,并且登录
     * @return
     */
 public static boolean connect(){
  boolean flag = false;
  ftp = new FTPClient();
  try {
   String serverIp = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_IP);
   int port = FtpResource.getInstane().getIntKey(FtpResource.FTP_SERVER_PORT);
   String user = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_USER);
   String pwd = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_PWD);
   
//   ftp.setDefaultTimeout(FTP_TIME_OUT);
//   ftp.setDataTimeout(FTP_TIME_OUT);
   ftp.connect(serverIp, port);
   flag = ftp.login(user, pwd);
   
   //传送文件类型
   ftp.setFileType(FTP.BINARY_FILE_TYPE);
  } catch (SocketException e) {
   //e.printStackTrace();
   StringBuffer sbLog = new StringBuffer(60);
   sbLog.append("文件上传连接出现SocketException异常=");
   sbLog.append(e.getMessage());
   PubLogs.printLogError(sbLog, null);
   return flag;
  } catch (Exception e) {
   e.printStackTrace();
   StringBuffer sbLog = new StringBuffer(60);
   sbLog.append("文件上传连接出现Exception异常=");
   sbLog.append(e.getMessage());
   PubLogs.printLogError(sbLog, null);
   return flag;
  }
  
  int reply = 0;
  try {
   reply = ftp.getReplyCode();
   System.out.println("code="+reply);
         if (!FTPReply.isPositiveCompletion(reply))
         {
             ftp.disconnect();
            
    StringBuffer sbLog = new StringBuffer(60);
             sbLog.append("FTP server refused connection.");
    sbLog.append(";退出服务");
    PubLogs.printLogError(sbLog, null);
            
         }
   
  } catch (Exception e) {
   e.printStackTrace();
  }
  
  
  
  
  return flag;
 }
 
 
 /**
  * 上传文件
  * @param path
  * @param fileName
  * @return
  */
 public static boolean ftp(final String path,final String fileName){
  InputStream local =null;
  boolean result = false;
  
  if(StringUtil.isEmpty(fileName)){
   StringBuffer sbLog = new StringBuffer(60);
            sbLog.append("fileName 参数为空,无法上传文件");
   PubLogs.printLogError(sbLog, null);
   return result;
  }
  
  try {
   local = new FileInputStream(path+File.separator+fileName);
   String serverPath = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_PATH);
   result =ftp.storeFile(serverPath+fileName, local);
   
  } catch (FileNotFoundException e) {
   StringBuffer sbLog = new StringBuffer(60);
            sbLog.append("没有发现文件异常=");
   sbLog.append(e.getMessage());
   PubLogs.printLogError(sbLog, null);
  }catch (IOException e) {
   StringBuffer sbLog = new StringBuffer(60);
            sbLog.append("没有发现文件异常=");
   sbLog.append(e.getMessage());
   PubLogs.printLogError(sbLog, null);
  }finally{
   if(null != local){
    try {
     local.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
   
   close();
  }
  
  
  return result;
 }
 
 
 //关闭ftp
 
 public static void close(){
   if (ftp!=null && ftp.isConnected()) {
               try {
                   ftp.logout();
                   ftp.disconnect();
              } catch (IOException e) {
                   e.printStackTrace();
              }
          }

 }
 
 
 
 public static void main(String[] args) {
  
  
//    boolean result = FtpUtil.connect();
//    if(result){
//     String path=FtpResource.getInstane().getStrKey(FtpResource.CLIENT_FILE_PATH);
//     System.out.println(FtpUtil.ftp(path,"noinfo.txt"));
//    }
  
  //OrderBO bo = new OrderBO();
    //查询未进行结算的订单
    List list = new ArrayList();
    list.add("==================ddd");
    
    
    //生成结算文件
    WriteFile wf = new WriteFile();
    //路径
    String path = FtpResource.getInstane().getStrKey(FtpResource.CLIENT_FILE_PATH);
    //文件名称
    String fileName =DateUtil.DateToString(Calendar.getInstance().getTime(), DateUtil.DATE_FORMAT_DATEONLYNOSP);
    
    boolean result = wf.write(list, path, fileName);
    
    //上传对账文件
    if(result){
        boolean ftpResult = FtpUtil.connect();
        if(ftpResult){
          boolean ftpfile = FtpUtil.ftp(path,fileName);
          if(ftpfile){
           StringBuffer log = new StringBuffer(60);
         log.append("上文件成功,名称:");
         log.append(fileName);
         PubLogs.autoLogInfo(log, null);
          }else{
           StringBuffer log = new StringBuffer(60);
         log.append("上文件成功,名称:");
         log.append(fileName);
         PubLogs.autoLogInfo(log, null);
          }
        }
     
    }else{
     StringBuffer log = new StringBuffer(60);
     log.append("生成对账文件时失败,对账文件名称:");
     log.append(fileName);
     PubLogs.autoLogError(log, null);
    }
    
    
    }
    
  
  
  
  
 

}

########################################################################

jdk7 自带的ftp 编写代码如下:

package com.aebiz.bas.util.ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;

import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
import sun.net.ftp.FtpDirEntry;
import sun.net.ftp.FtpProtocolException;

import com.aebiz.pub.logs.PubLogs;
import com.aebiz.pub.util.DateUtil;
import com.aebiz.pub.util.StringUtil;

/**
 * jdk7 版文件上传功能
 * 只支持jdk7
 * @author dell
 *
 */
public class FtpJava {
 
 /**
  *
  * FTP客户端
  */
 private FtpClient ftpClient;

    /**
     * 连接ftp 服务器,并且登录
     * @return
     */
 public  boolean connect(){
  boolean flag = false;
  try {
   String serverIp = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_IP);
   int port = FtpResource.getInstane().getIntKey(FtpResource.FTP_SERVER_PORT);
   String user = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_USER);
   String pwd = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_PWD);
   
   
   ftpClient =FtpClient.create();
   ftpClient.connect(new InetSocketAddress(serverIp, port));
   
   ftpClient.login(user,pwd.toCharArray());
   // 设置成2进制传输
   ftpClient.setBinaryType();
   System.out.println("login success!");
   
   
   flag = true;
  } catch (SocketException e) {
   //e.printStackTrace();
   flag = false;
   StringBuffer sbLog = new StringBuffer(60);
   sbLog.append("文件上传连接出现SocketException异常=");
   sbLog.append(e.getMessage());
   PubLogs.printLogError(sbLog, null);
   return flag;
  } catch (Exception e) {
   flag = false;
   StringBuffer sbLog = new StringBuffer(60);
   sbLog.append("文件上传连接出现Exception异常=");
   sbLog.append(e.getMessage());
   PubLogs.printLogError(sbLog, null);
   return flag;
  }
  
  return flag;
 }
 
 
 /**
  * 上传文件
  * @param path
  * @param fileName
  * @return
  */
 public  boolean ftp(final String path,final String fileName){
  InputStream local =null;
  boolean result = false;
  
  
  try {
   String serverPath = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_PATH);
  
   if (!StringUtil.isEmpty(serverPath)){
    // 把远程系统上的目录切换到参数path所指定的目录
    ftpClient.changeDirectory(serverPath);
   }
   
   Iterator<FtpDirEntry>  it = ftpClient.listFiles(fileName);
   //如果文件已经存在删除
   if(it.hasNext()){
    ftpClient.deleteFile(fileName);
    StringBuffer sbLog = new StringBuffer(60);
             sbLog.append("删除重复提交文件=");
             sbLog.append(fileName).append(";result=");
    sbLog.append(ftpClient.getLastResponseString());
    PubLogs.printLogError(sbLog, null);    
   }
   
  } catch (FtpProtocolException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
  
  if(StringUtil.isEmpty(fileName)){
   StringBuffer sbLog = new StringBuffer(60);
            sbLog.append("fileName 参数为空,无法上传文件");
   PubLogs.printLogError(sbLog, null);
   return result;
  }
  
  TelnetOutputStream os = null;
  
  try {
   local = new FileInputStream(path+File.separator+fileName);
   
   // 将远程文件加入输出流中
   os = (TelnetOutputStream) ftpClient.putFileStream(fileName, true);

   // 创建一个缓冲区
   byte[] bytes = new byte[1024];
   int c;
   while ((c = local.read(bytes)) != -1)
   {
    os.write(bytes, 0, c);
   }
   
   
  } catch (FileNotFoundException e) {
   StringBuffer sbLog = new StringBuffer(60);
            sbLog.append("没有发现文件异常=");
   sbLog.append(e.getMessage());
   PubLogs.printLogError(sbLog, null);
  }catch (Exception e) {
   StringBuffer sbLog = new StringBuffer(60);
            sbLog.append("没有发现文件异常=");
   sbLog.append(e.getMessage());
   PubLogs.printLogError(sbLog, null);
  }finally{
   if(null != local){
    try {
     local.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
   
   
   if(null !=os){
    try {
     os.close();
    } catch (Exception e2) {
     e2.printStackTrace();
    }
   }
   
   close();
  }
  
  
  return result;
 }
 
 
 //关闭ftp
 
 public  void close(){
   if (ftpClient!=null && ftpClient.isConnected()) {
               try {
                ftpClient.close();
              } catch (IOException e) {
                   e.printStackTrace();
              }
          }

 }
 
 
 
 public static void main(String[] args) {
     //查询未进行结算的订单
     List list = new ArrayList();
     list.add("=66==========99=====456==ddd");
     
     
     //生成结算文件
     WriteFile wf = new WriteFile();
     //路径
     String path = FtpResource.getInstane().getStrKey(FtpResource.CLIENT_FILE_PATH);
     //文件名称
     String fileName =DateUtil.DateToString(Calendar.getInstance().getTime(), DateUtil.DATE_FORMAT_DATEONLYNOSP);
     
     boolean result = wf.write(list, path, fileName);
     
     //上传对账文件
     if(result){
      FtpJava ftpJava = new FtpJava();
         boolean ftpResult = ftpJava.connect();
         if(ftpResult){
           boolean ftpfile = ftpJava.ftp(path,fileName);
           if(ftpfile){
            StringBuffer log = new StringBuffer(60);
          log.append("上文件成功,名称:");
          log.append(fileName);
          PubLogs.autoLogInfo(log, null);
           }else{
            StringBuffer log = new StringBuffer(60);
          log.append("上文件成功,名称:");
          log.append(fileName);
          PubLogs.autoLogInfo(log, null);
           }
         }
      
     }else{
      StringBuffer log = new StringBuffer(60);
      log.append("生成对账文件时失败,对账文件名称:");
      log.append(fileName);
      PubLogs.autoLogError(log, null);
     }
     
     
 }
 

}

猜你喜欢

转载自gjp014.iteye.com/blog/2309496