`

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

    博客分类:
  • java
 
阅读更多

最近使用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);
     }
     
     
 }
 

}

 

 

分享到:
评论

相关推荐

    commons-net-ftp-2.0.jar.zip

    FTP是一种用于在互联网上传输文件的标准协议,它的主要功能包括下载、上传文件,以及管理远程服务器上的文件。Apache Commons Net库提供了一套完整的API,使得Java程序员可以方便地实现这些功能,而无需关心底层的...

    commons-net-3.3-API文档-中文版.zip

    赠送jar包:commons-net-3.3.jar; 赠送原API文档:commons-net-3.3-javadoc.jar; 赠送源代码:commons-net-3.3-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    commons-net-3.1.jar,3.3,3.6版本

    - Commons Net提供了完善的FTP客户端实现,可以进行文件的上传、下载、删除等操作,支持FTP、FTPS(FTP over SSL/TLS)和SFTP(SSH File Transfer Protocol)。 - 在不同版本中,FTP客户端的性能和稳定性得到了...

    commons-csv-1.4.jar

    commons-csv-1.4.jar java生成CSV文件jar包,jdk1.6可用 commons-csv-1.4.jar java生成CSV文件jar包,jdk1.6可用 commons-csv-1.4.jar java生成CSV文件jar包,jdk1.6可用 commons-csv-1.4.jar java生成CSV文件jar包...

    commons-compress包

    apache.commons.compress 第三方开源软件。能解压,压缩文件。里面包括commons-compress-1.9、commons-compress-1.2.1的版本。 当遇到这种错误,应该重点关注Caused by:后面的内容 Caused by:xxx Unsupported major....

    JSONObject对象依赖的jar包,json-lib-2.4-jdk15,commons-beanutils,commons-collections

    在web项目中经常会用到json数据(如...json-lib-2.4-jdk15.jar json所依赖的jar如下: commons-beanutils-1.8.0.jar commons-collections-3.2.1.jar commons-lang-3.7.jar commons-logging-1.1.1.jar ezmorph-1.0.6.jar

    commons-net-1.4.1.jar

    Apache Commons Net 1.4.1提供了一个全面的Java实现,支持FTP的各种操作,包括上传、下载、列出目录、创建和删除文件等。这个库不仅简化了FTP交互,还处理了许多底层的网络细节,如连接管理和错误处理,使得开发者...

    commons-codec-1.15-API文档-中文版.zip

    赠送jar包:commons-codec-1.15.jar; 赠送原API文档:commons-codec-1.15-javadoc.jar; 赠送源代码:commons-codec-1.15-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    commons-beanutils-1.9.4-API文档-中文版.zip

    赠送jar包:commons-beanutils-1.9.4.jar; 赠送原API文档:commons-beanutils-1.9.4-javadoc.jar; 赠送源代码:commons-beanutils-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    istack-commons-runtime-3.0.12-API文档-中英对照版.zip

    赠送jar包:istack-commons-runtime-3.0.12.jar; 赠送原API文档:istack-commons-runtime-3.0.12-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    jdk7,jdk-7u80-linux-x64.tar.gz

    压缩包子文件的文件名称列表包括"jdk-7u80-linux-x64.tar.gz"和"linux下使用.txt"。前者是JDK的安装包,后者可能是一个指南或说明文档,指导用户如何在Linux环境下安装和配置JDK。在Linux中,安装JDK通常涉及以下...

    jdk-7u80-windows-x64.zip

    它引入了许多新特性,旨在提高开发效率、增强语言功能和提升性能。以下是一些关键的Java 7特性: 1. **多 catch 语句**:允许在一个try-catch块中捕获多个异常类型,使得代码更加简洁。 2. **二进制整数和浮点数字...

    istack-commons-runtime-3.0.12-API文档-中文版.zip

    赠送jar包:istack-commons-runtime-3.0.12.jar; 赠送原API文档:istack-commons-runtime-3.0.12-javadoc.jar; 赠送源代码:istack-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    commons-csv-1.8-API文档-中英对照版.zip

    赠送jar包:commons-csv-1.8.jar; 赠送原API文档:commons-csv-1.8-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    commons-io-2.7-API文档-中文版.zip

    赠送jar包:commons-io-2.7.jar; 赠送原API文档:commons-io-2.7-javadoc.jar; 赠送源代码:commons-io-2.7-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    jdk-7u80-Linux 安装包+安装教程

    这个文件包含了JDK的所有组成部分,如Java编译器(javac)、Java虚拟机(JVM)、Java运行时环境(JRE)、开发者工具(如javadoc和jconsole)以及其他必要的库和文件。使用tar.gz格式是为了在Linux上节省磁盘空间并...

    jdk7 jdk-7u80-linux-x64 网盘下载

    - 更新了JavaFX SDK,增强了其多媒体功能和支持。 - 对Java API进行了微调,修复了一些已知的问题。 #### 四、JDK 7 Linux x64 版本安装指南 ##### 4.1 下载JDK 7 Linux x64 根据提供的网盘链接...

    jdk-7u80-windows-x64.rar

    总的来说,"jdk-7u80-windows-x64.rar"文件对于Java开发者而言是一个重要的资源,它包含了运行和开发Java应用程序所需的全部组件。通过正确安装和配置,开发者可以利用JDK 7 Update 80的特性来构建高效、安全且跨...

    commons-httpclient3.1.jar,commons-codec1.3.jar,commons-logging1.1.1.jar

    标题中的"commons-httpclient3.1.jar,commons-codec1.3.jar,commons-logging1.1.1.jar"指的是三个关键的Java库文件,它们是Apache HttpClient项目的一部分,用于在Java应用程序中实现HTTP通信。这些JAR(Java ...

    jdk1.7官网 jdk-7u80-linux-x64.tar.gz.zip

    Java开发工具JDK(Java Development Kit)是Oracle公司提供的用于编写和运行Java应用程序的重要软件包。JDK 1.7,也称为Java SE 7(Java Standard Edition 7),是Java编程语言的一个重要版本,发布于2011年,包含了...

Global site tag (gtag.js) - Google Analytics