您的位置:首页 > 编程语言 > Java开发

java 中 FtpClient 实现 FTP 文件上传、下载

2017-07-20 15:51 676 查看


源代码大部分是网上找的,查来查去,找到几个可以用的例子,改来改去,揉合成现在这个样子。



[b]maven/Java/web/bootstrap/dataTable/app开发QQ群:566862629。希望更多人一起帮助我学习。
[/b]







一、 jar包准备(web service 的jar  不需要)








二、配置文件:








配置文件内容:

ftpUserName=hn_name
ftpPassword=hn_pwd
ftpHost=10.3.4.222
ftpPort=21
ftpPath=/home/hn_dhmp
writeTempFielPath=D\:\\ftpDownLoad


三、 ftp 工具类:



package ftp;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;

/**
* ftp 上传、下载工具类
* @author JiangYu
*/
public class FtpUtil {

private static Logger logger = Logger.getLogger(FtpUtil.class);

/**
* 获取FTPClient对象
* @param ftpHost FTP主机服务器
* @param ftpPassword FTP 登录密码
* @param ftpUserName FTP登录用户名
* @param ftpPort FTP端口 默认为21
* @return
*/
public static FTPClient getFTPClient(String ftpHost, String ftpPassword,
String ftpUserName, int ftpPort) {

FTPClient ftpClient = null;
try {
ftpClient = new FTPClient();
ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
logger.info("未连接到FTP,用户名或密码错误 !");
ftpClient.disconnect();
} else {
logger.info("FTP连接成功。");
}
} catch (SocketException e) {
e.printStackTrace();
logger.info("请检查FTP的IP地址 ! ");
} catch (IOException e) {
e.printStackTrace();
logger.info("请核对FTP的端口 ! ");
}
return ftpClient;
}

/**
* 上传本地文件到FTP服务器
* @param ftpPath 服务器上存放文件的路径
* @param ftpUserName ftp服务账号
* @param ftpPassword ftp服务密码
* @param ftpHost ftp服务ip
* @param ftpPort ftp服务端口
* @param fileContent 文件内容
* @param writeTempFielPath 文件在本地的路径
*/
public static String upload(String ftpPath, String ftpUserName, String ftpPassword,
String ftpHost, int ftpPort, String fileContent, String writeTempFielPath) {

FTPClient ftpClient = null;
String uploadResult = "";
try {
ftpClient = getFTPClient(ftpHost, ftpPassword,
ftpUserName, ftpPort);
// 设置PassiveMode传输
ftpClient.enterLocalPassiveMode();
// 设置以二进制流的方式传输
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
// 对远程目录的处理
String remoteFileName = ftpPath;
if (ftpPath.contains("/")) {
remoteFileName = ftpPath
.substring(ftpPath.lastIndexOf("/") + 1);
}
// 先把文件写出到本地,再上传到FTP上,最后再删除 。
String result = write(remoteFileName, fileContent,
writeTempFielPath);
if (result.contains("成功")) {
File f = new File(writeTempFielPath + "/" + remoteFileName);
InputStream in = new FileInputStream(f);
ftpClient.storeFile(remoteFileName, in);
in.close();
uploadResult = "文件" + remoteFileName + "上传成功!";
f.delete(); // 删除本地临时文件
} else {
uploadResult =  "文件" + remoteFileName + "上传失败!";
}
return uploadResult;
} catch (Exception e) {
e.printStackTrace();
return uploadResult+"错误源: "+e.getMessage();
}finally{
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}

/**
* 文件写出到本地
* @param fileName 文件名
* @param fileContext 文件内容
* @param writeTempFielPath 本地存储路径
* @return
*/
public static String write(String fileName, String fileContext,
String writeTempFielPath) {

String result = "写出成功 !";
try {
File f = new File(writeTempFielPath + "/" + fileName);
if(!f.exists()){
if(!f.createNewFile()){
result = "文件不存在,创建失败 !";
}
}
BufferedWriter bw = new BufferedWriter(new FileWriter(f, true));
bw.write(fileContext.replaceAll("\n", "\r\n"));
bw.flush();
bw.close();
return result;
} catch (Exception e) {
result = "写出失败 !";
e.printStackTrace();
return result;
}
}

/**
* 从FTP服务器下载文件
* @param ftpHost FTP服务器IP
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param remotePath FTP服务器上的相对路径
* @param fileName 要下载的文件名
* @param localPath 下载后保存到本地的路径
* @return
*/
public static String downFile(String ftpHost, int port,String username, String password,
String remotePath,String fileName,String localPath) {

String result = "下载失败 !";
FTPClient ftp = new FTPClient();

try {
int reply;
ftp.connect(ftpHost, port);
ftp.login(username, password); // 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return "服务连接失败 !";
}

ftp.changeWorkingDirectory(remotePath); // 转移到FTP服务器目录
FTPFile[] fs = ftp.listFiles();
boolean flag = false; // 下载文件不存在
for(FTPFile ff:fs){
if(ff.getName().equals(fileName)){
File localFile = new File(localPath+"/"+ff.getName());
OutputStream is = new FileOutputStream(localFile);
ftp.retrieveFile(ff.getName(), is);
is.close();
flag = true;
}
}
ftp.logout();

if(!flag){
result = "文件: "+fileName+"不存在 !";
}else{
result = "下载成功 !";
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {}
}
}
return result;
}

}



upload方法可以用这个方法代替,直接上传整个文件,而不作用把文件内容作为参数,此方法主体代码来自网络:


package ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.commons.net.ftp.FTPClient;
/**
* 文件上传替换方法
*
*/
public class FtpUpToo {

private static FTPClient ftpClient = null;

/**
* ftp上传文件
* @param targetFname 生成目标文件
* @return true||false
*/
public static boolean uploadFile(String targetFname){

int ftpPort = 0;
String ftpUserName = ""; // ftp服务账号
String ftpPassword = ""; // ftp服务密码
String ftpHost = ""; // ftp服务ip
String ftpPath = ""; // ftp服务器上存放文件的路径
String writeTempFielPath = ""; // 文件在本地的路径
String proName = "ftp.properties"; // 配置文件名

try {
// 配置文件一定要和本类放在同一包下才能找到
InputStream in = FtpUtil.class.getClassLoader().getResourceAsStream(proName);
if (in == null) {
throw new Exception("配置文件"+proName+"读取失败 !");
}

Properties properties = new Properties();
properties.load(in);
ftpUserName = properties.getProperty("ftpUserName");
ftpPassword = properties.getProperty("ftpPassword");
ftpHost = properties.getProperty("ftpHost");
ftpPort = Integer.valueOf(properties.getProperty("ftpPort"))
.intValue();
ftpPath = properties.getProperty("ftpPath");
writeTempFielPath = properties.getProperty("writeTempFielPath");
} catch (Exception e) {
e.printStackTrace();
}

boolean flag = false;
ftpClient = FtpUtil.getFTPClient(ftpHost, ftpPassword, ftpUserName, ftpPort);
if( ftpClient!=null ){
File srcFile = new File(writeTempFielPath+"/JiangYuUp.csv");
FileInputStream fis = null;
try {
fis = new FileInputStream(srcFile);
//设置上传目录
ftpClient.changeWorkingDirectory(ftpPath);
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("GBK");
//设置文件类型(二进制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//上传
flag = ftpClient.storeFile(targetFname, fis);
} catch (Exception e) {
e.printStackTrace();
closeCon();
}finally{
try {
fis.close();
System.out.println("运行结束!----");
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}

/**
* 销毁ftp连接
*/
public static void closeCon(){
if(ftpClient !=null){
if(ftpClient.isConnected()){
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

}


四、测试类:



package ftp;

import java.io.InputStream;
import java.util.Properties;

public class FtpTest {

public static void main(String[] args) {

new FtpTest().test();

}

private void test(){

int ftpPort = 0;
String ftpUserName = "";  // ftp服务账号
String ftpPassword = "";  // ftp服务密码
String ftpHost = "";  // ftp服务ip
String ftpPath = "";  // ftp服务器上存放文件的路径
String writeTempFielPath = "";  // 文件在本地的路径
String proName = "ftp.properties"; // 配置文件名

try {
// 配置文件一定要和本类放在同一包下才能找到
InputStream in = FtpUtil.class.getClassLoader().getResourceAsStream(proName);
if (in == null) {
throw new Exception("配置文件"+proName+"读取失败 !");
}

Properties properties = new Properties();
properties.load(in);
ftpUserName = properties.getProperty("ftpUserName");
ftpPassword = properties.getProperty("ftpPassword");
ftpHost = properties.getProperty("ftpHost");
ftpPort = Integer.valueOf(properties.getProperty("ftpPort"))
.intValue();
ftpPath = properties.getProperty("ftpPath");
writeTempFielPath = properties.getProperty("writeTempFielPath");

// 下载
String result = FtpUtil.downFile(ftpHost, ftpPort, ftpUserName, ftpPassword,
ftpPath, "JiangYu.csv", writeTempFielPath);  // JiangYu.csv:下载文件的名称
System.out.println("文件下载结果为:" + result);

// 上传
ftpPath = ftpPath + "/" + "JiangYu.csv";  // JiangYu.csv:上传文件的名称
FtpUtil.upload(ftpPath, ftpUserName, ftpPassword, ftpHost, ftpPort, "这里是文件内容", writeTempFielPath);
} catch (Exception e) {
e.printStackTrace();
}
}
}  




注:  测试类运行后下载成功的文件 和 上传时的临时文件是一样的名字,会被上传成功后删除临时文件操作所删除。
 建议上传和下载分开测试。



五、 上传、下载结果:









内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息