Java实现FTP文件与文件夹的上传和下载

网友投稿 526 2023-06-23


Java实现FTP文件与文件夹的上传和下载

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。

首先下载了Serv-U将自己的电脑设置为了FTP文件服务器,方便操作。下面代码的使用都是在FTP服务器已经创建,并且要在代码中写好FTP连接的相关数据才可以完成。

1.FTP文件的上传与下载(注意是单个文件的上传与下载)

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

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

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

import org.apache.commons.net.ftp.FTPFile;

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

/**

* 实现FTP文件上传和文件下载

*/

public class FtpApche {http://

private static FTPClient ftpClient = new FTPClient();

private static String encoding = System.getProperty("file.encoding");

/**

* Description: 向FTP服务器上传文件

*

* @Version1.0

* @param url

* FTP服务器hostname

* @param port

* FTP服务器端口

* @param username

* FTP登录账号

* @param password

* FTP登录密码

* @param path

* FTP服务器保存目录,如果是根目录则为“/”

* @param filename

* 上传到FTP服务器上的文件名

* @param input

* 本地文件输入流

* @return 成功返回true,否则返回false

*/

public static boolean uploadFile(String url, int port, String username,

String password, String path, String filename, InputStream input) {

boolean result = false;

try {

int reply;

// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器

ftpClient.connect(url);

// ftp.connect(url, port);// 连接FTP服务器

// 登录

ftpClient.login(username, password);

ftpClient.setControlEncoding(encoding);

// 检验是否连接成功

reply = ftpClient.getReplyCode();

if (!FTPReply.isPositiveCompletion(reply)) {

System.out.println("连接失败");

ftpClient.disconnect();

return result;

}

// 转移工作目录至指定目录下

boolean change = ftpClient.changeWorkingDirectory(path);

ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

if (change) {

result = ftpClient.storeFile(new String(filename.getBytes(encoding),"iso-8859-1"), input);

if (result) {

System.out.println("上传成功!");

}

}

input.close();

ftpClient.logout();

} catch (IOException e) {

e.printStackTrace();

} finally {

if (ftpClient.isConnected()) {

try {

ftpClient.disconnect();

} catch (IOException ioe) {

}

}

}

return result;

}

/**

* 将本地文件上传到FTP服务器上

*

*/

public void testUpLoadFromDisk() {

try {

FileInputStream in = new FileInputStream(new File("D:/test02/list.txt"));

boolean flag = uploadFile("10.0.0.102", 21, "admin","123456", "/", "lis.txt", in);

System.out.println(flag);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

/**

* Description: 从FTP服务器下载文件

*

* @Version1.0

* @param url

* FTP服务器hostname

* @param port

* FTP服务器端口

* @param username

* FTP登录账号

* @param password

* FTP登录密码

* @param remotePath

* FTP服务器上的相对路径

* @param fileName

* 要下载的文件名

* @param localPath

* 下载后保存到本地的路径

* @return

*/

public static boolean downFile(String url, int port, String username,

String password, String remotePath, String fileName,

String localPath) {

boolean result = false;

try {

int reply;

ftpClient.setControlEncoding(encoding);

/*

* 为了上传和下载中文文件,有些地方建议使用以下两句代替

* new String(remotePath.getBytes(encoding),"iso-8859-1")转码。

* 经过测试,通不过。

*/

// FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);

// conf.setServerLanguageCode("zh");

ftpClient.connect(url, port);

// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器

ftpClient.login(username, password);// 登录

// 设置文件传输类型为二进制

ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

// 获取ftp登录应答代码

reply = ftpClient.getReplyCode();

// 验证是否登陆成功

if (!FTPReply.isPositiveCompletion(reply)) {

ftpClient.disconnect();

System.err.println("FTP server refused connection.");

return result;

}

// 转移到FTP服务器目录至指定的目录下

ftpClient.changeWorkingDirectory(new String(remotePath.getBytes(encoding),"iso-8859-1"));

// 获取文件列表

FTPFile[] fs = ftpClient.listFiles();

for (FTPFile ff : fs) {

if (ff.getName().equals(fileName)) {

File localFile = new File(localPath + "/" + ff.getName());

OutputStream is = new FileOutputStream(localFile);

ftpClient.retrieveFile(ff.getName(), is);

is.close();

}

}

ftpClient.logout();

result = true;

} catch (IOException e) {

e.printStackTrace();

} finally {

if (ftpClient.isConnected()) {

try {

ftpClient.disconnect();

} catch (IOException ioe) {

}

}

}

return result;

}

/**

* 将FTP服务器上文件下载到本地

*

*/

public void testDownFile() {

try {

boolean flag = downFile("10.0.0.102", 21, "admin",

"123456", "/", "ip.txt", "E:/");

System.out.println(flag);

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

FtpApche fa = new FtpApche();

fa.testDownFile();

fa.testUpLoadFromDisk();

}

}

2.FTP文件夹的上传与下载(注意是整个文件夹)

package ftp;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.TimeZone;

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

import org.apache.commons.net.ftp.FTPClientConfig;

import org.apache.commons.net.ftp.FTPFile;

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

import org.apache.log4j.Logger;

public class FTPTest_04 {

private FTPClient ftpClient;

private String strIp;

private int intPort;

private String user;

private String password;

private static Logger logger = Logger.getLogger(FTPTest_04.class.getName());

/* *

* Ftp构造函数

*/

public FTPTest_04(String strIp, int intPort, String user, String Password) {

this.strIp = strIp;

this.intPort = intPort;

this.user = user;

this.password = Password;

this.ftpClient = new FTPClient();

}

/**

* @return 判断是否登入成功

* */

public boolean ftpLogin() {

boolean isLogin = false;

FTPClientConfig ftpClientConfig = new FTPClientConfig();

ftpClientConfig.setServerTimeZoneId(TimeZone.getDefault().getID());

this.ftpClient.setControlEncoding("GBK");

this.ftpClient.configure(ftpClientConfig);

try {

if (this.intPort > 0) {

this.ftpClient.connect(this.strIp, this.intPort);

}else {

this.ftpClient.connect(this.strIp);

}

// FTP服务器连接回答

int reply = this.ftpClient.getReplyCode();

if (!FTPReply.isPositiveCompletion(reply)) {

this.ftpClient.disconnect();

logger.error("登录FTP服务失败!");

return isLogin;

}

this.ftpClient.login(this.user, this.password);

// 设置传输协议

this.ftpClient.enterLocalPassiveMode();

this.ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

logger.info("恭喜" + this.user + "成功登陆FTP服务器");

isLogin = true;

}catch (Exception e) {

e.printStackTrace();

logger.error(this.user + "登录FTP服务失败!" + e.getMessage());

}

this.ftpClient.setBufferSize(1024 * 2);

this.ftpClient.setDataTimeout(30 * 1000);

return isLogin;

}

/**

* @退出关闭服务器链接

* */

public void ftpLogOut() {

if (null != this.ftpClient && this.ftpClient.isConnected()) {

try {

boolean reuslt = this.ftpClient.logout();// 退出FTP服务器

if (reuslt) {

logger.info("成功退出服务器");

}

}catch (IOException e) {

e.printStackTrace();

logger.warn("退出FTP服务器异常!" + e.getMessage());

}finally {

try {

this.ftpClient.disconnect();// 关闭FTP服务器的连接

}catch (IOException e) {

e.printStackTrace();

logger.warn("关闭FTP服务器的连接异常!");

}

}

}

}

/***

* 上传Ftp文件

* @param localFile 当地文件

* @param romotUpLoadePath上传服务器路径 - 应该以/结束

* */

public boolean uploadFile(File localFile, String romotUpLoadePath) {

BufferedInputStream inStream = null;

boolean success = false;

try {

this.ftpClient.changeWorkingDirectory(romotUpLoadePath);// 改变工作路径

inStream = new BufferedInputStream(new FileInputStream(localFile));

logger.info(localFile.getName() + "开始上传.....");

success = this.ftpClient.storeFile(localFile.getName(), inStream);

if (success == true) {

logger.info(localFile.getName() + "上传成功");

return success;

}

}catch (FileNotFoundException e) {

e.printStackTrace();

logger.error(localFile + "未找到");

}catch (IOException e) {

e.printStackTrace();

}finally {

if (inStream != null) {

try {

inStream.close();

}catch (IOException e) {

e.printStackTrace();

}

}

}

return success;

}

/***

* 下载文件

* @param remoteFileName 待下载文件名称

* @param localDires 下载到当地那个路径下

* @param remoteDownLoadPath remoteFileName所在的路径

* */

public boolean downloadFile(String remoteFileName, String localDires,

String remoteDownLoadPath) {

String strFilePath = localDires + remoteFileName;

BufferedOutputStream outStream = null;

boolean success = false;

try {

this.ftpClient.changeWorkingDirectory(remoteDownLoadPath);

outStream = new BufferedOutputStream(new FileOutputStream(

strFilePath));

logger.info(remoteFileName + "开始下载....");

success = this.ftpClient.retrieveFile(remoteFileName, outStream);

if (success == true) {

logger.info(remoteFileName + "成功下载到" + strFilePath);

return success;

}

}catch (Exception e) {

e.printStackTrace();

logger.error(remoteFileName + "下载失败");

}finally {

if (null != outStream) {

try {

outStream.flush();

outStream.close();

}catch (IOException e) {

e.printStackTrace();

}

}

}

if (success == false) {

logger.error(remoteFileName + "下载失败!!!");

}

return success;

}

/***

* @上传文件夹

* @param localDirectory

* 当地文件夹

* @param remoteDirectoryPath

* Ftp 服务器路径 以目录"/"结束

* */

wHQmiFU public boolean uploadDirectory(String localDirectory,

String remoteDirectoryPath) {

File src = new File(localDirectory);

try {

remoteDirectoryPath = remoteDirectoryPath + src.getName() + "/";

boolean makeDirFlag = this.ftpClient.makeDirectory(remoteDirectoryPath);

System.out.println("localDirectory : " + localDirectory);

System.out.println("remoteDirectoryPath : " + remoteDirectoryPath);

System.out.println("src.getName() : " + src.getName());

System.out.println("remoteDirectoryPath : " + remoteDirectoryPath);

System.out.println("makeDirFlag : " + makeDirFlag);

// ftpClient.listDirectories();

}catch (IOException e) {

e.printStackTrace();

logger.info(remoteDirectoryPath + "目录创建失败");

}

File[] allFile = src.listFiles();

for (int currentFile = 0;currentFile < allFile.length;currentFile++) {

if (!allFile[currentFile].isDirectory()) {

String srcName = allFile[currentFile].getPath().toString();

uploadFile(new File(srcName), remoteDirectoryPath);

}

}

for (int currentFile = 0;currentFile < allFile.length;currentFile++) {

if (allFile[currentFile].isDirectory()) {

// 递归

uploadDirectory(allFile[currentFile].getPath().toString(),

remoteDirectoryPath);

}

}

return true;

}

/***

* @下载文件夹

* @param localDirectoryPath本地地址

* @param remoteDirectory 远程文件夹

* */

public boolean downLoadDirectory(String localDirectoryPath,String remoteDirectory) {

try {

String fileName = new File(remoteDirectory).getName();

localDirectoryPath = localDirectoryPath + fileName + "//";

new File(localDirectoryPath).mkdirs();

FTPFile[] allFile = this.ftpClient.listFiles(remoteDirectory);

for (int currentFile = 0;currentFile < allFile.length;currentFile++) {

if (!allFile[currentFile].isDirectory()) {

downloadFile(allFile[currentFile].getName(),localDirectoryPath, remoteDirectory);

}

}

for (int currentFile = 0;currentFile < allFile.length;currentFile++) {

if (allFile[currentFile].isDirectory()) {

String strremoteDirectoryPath = remoteDirectory + "/"+ allFile[currentFile].getName();

downLoadDirectory(localDirectoryPath,strremoteDirectoryPath);

}

}

}catch (IOException e) {

e.printStackTrace();

logger.info("下载文件夹失败");

return false;

}

return true;

}

// FtpClient的Set 和 Get 函数

public FTPClient getFtpClient() {

return ftpClient;

}

public void setFtpClient(FTPClient ftpClient) {

this.ftpClient = ftpClient;

}

public static void main(String[] args) throws IOException {

FTPTest_04 ftp=new FTPTest_04("10.0.0.102",21,"admin","123456");

ftp.ftpLogin();

System.out.println("1");

//上传文件夹

boolean uploadFlag = ftp.uploadDirectory("D:\\test02", "/"); //如果是admin/那么传的就是所有文件,如果只是/那么就是传文件夹

System.out.println("uploadFlag : " + uploadFlag);

//下载文件夹

ftp.downLoadDirectory("d:\\tm", "/");

ftp.ftpLogOut();

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于vue的下拉刷新指令和滚动刷新指令
下一篇:基于bootstrap的文件上传控件bootstrap fileinput
相关文章

 发表评论

暂时没有评论,来抢沙发吧~