诀别使用 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);
}
}
}