package org.springblade.modules.FTP;
|
|
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.net.ftp.FTP;
|
import org.apache.commons.net.ftp.FTPClient;
|
import org.apache.commons.net.ftp.FTPReply;
|
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.net.SocketException;
|
|
public class FtpUploadFile {
|
private final static Log logger = LogFactory.getLog(FtpUploadFile.class);
|
/**
|
* 获取ftpClient对象
|
* @param ftpHost FTP服务器地址
|
* @param ftpUserName 登录FTP服务器用户名
|
* @param ftpPassword 登录FTP服务器密码
|
* @param ftpPort FTP服务器端口
|
* @return
|
*/
|
public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) {
|
FTPClient ftpClient = new FTPClient();
|
//ftpClient.setControlEncoding("GBK"); // 传输的字符编码(防止乱码),自带的编码是ISO-8859-1,一般不会出现乱码
|
//超时时间(防止僵死)
|
//ftpClient.setDataTimeout(1000*60);
|
//ftpClient.setDefaultTimeout(1000*60);
|
//工作流的大小
|
//ftpClient.setBufferSize(1024*4);
|
//主被动模式(应对FTP服务器的相关安全设置)
|
ftpClient.enterLocalPassiveMode();
|
//ftpClient.enterLocalActiveMode();
|
try {
|
ftpClient.connect(ftpHost, ftpPort); // 连接FTP服务器
|
if(ftpClient.isConnected()) {
|
//使用用户名和密码登录
|
if(ftpClient.login(ftpUserName, ftpPassword)) {
|
//判断FTP连接是否可用,源码中是通过判断ReplyCode值(200=< reply <300)
|
if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
|
logger.info("FTP连接成功。");
|
System.out.println("FTP登录成功,ftpHost: ftp:/"+ftpClient.getRemoteAddress());
|
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
|
}
|
}else {
|
logger.info("未连接到FTP,用户名或密码错误。");
|
ftpClient.disconnect();
|
}
|
}
|
} catch (SocketException e) {
|
e.printStackTrace();
|
logger.info("FTP的IP地址可能错误,请正确配置。");
|
} catch (IOException e) {
|
e.printStackTrace();
|
logger.info("FTP的端口错误,请正确配置。");
|
}
|
return ftpClient;
|
}
|
|
/**
|
* 上传文件
|
* @param ftpHost FTP服务器地址
|
* @param ftpUserName 登录FTP服务器用户名
|
* @param ftpPassword 登录FTP服务器密码
|
* @param ftpPort FTP服务器端口
|
* @param ftpPath 上传到FTP服务器的指定目录
|
* @param filename 上传的文件名
|
* @param input 文件输入流
|
* @return 成功返回true,否则返回false
|
*/
|
public static boolean uploadFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String filename, InputStream input) {
|
boolean result = false;
|
FTPClient ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
|
try {
|
int reply;
|
reply = ftpClient.getReplyCode(); //用户名密码错误时,值是530
|
|
if (!FTPReply.isPositiveCompletion(reply)) { //判断是否成功登录
|
//ftpClient.disconnect(); //用户名密码错误时报空指针,是因为在用户名密码不正确时,在上面已执行disconnect操作
|
return result;
|
}
|
|
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
|
ftpClient.makeDirectory(ftpPath); //目录不存在则创建目录
|
ftpClient.changeWorkingDirectory(ftpPath); //切换到要上传的目录
|
//编码文件名,支持中文文件名
|
filename = new String(filename.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING);
|
//上传文件
|
if (!ftpClient.storeFile(filename, input)) {
|
System.out.println("文件已存在"); //应该是判断文件是否已存在服务器上
|
return result;
|
}
|
input.close();
|
ftpClient.logout();
|
result = true;
|
} catch (IOException e) {
|
e.printStackTrace();
|
} catch (NullPointerException e){
|
e.printStackTrace();
|
} finally {
|
if (ftpClient.isConnected()) {
|
try {
|
ftpClient.disconnect();
|
} catch (IOException e) {}
|
}
|
}
|
return result;
|
}
|
|
public static void main(String[] args) {
|
String ftpHost = "192.168.0.105";
|
String ftpUserName = "yly";
|
String ftpPassword = "Yly@123";
|
int ftpPort = 21;
|
//String ftpPath = ""; //目录名, ""表示根目录
|
String ftpPath = ""; //目录名最好是英文,中文目录暂时还未成功上传
|
String fileName = "fz.py"; //要上传的文件名
|
|
//上传文件
|
try{
|
FileInputStream in=new FileInputStream(new File("D:\\" + fileName)); //要上传的文件所在的目录,这里放的是D盘的根目录下
|
Boolean result = FtpUploadFile.uploadFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath, fileName, in);
|
if(result){
|
System.out.println(fileName+"文件上传成功");
|
}else{
|
System.out.println(fileName+"文件上传失败");
|
}
|
} catch (Exception e){
|
e.printStackTrace();
|
}
|
}
|
}
|