jar包:
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.5</version>
</dependency>
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
public class FtpFileUtil {
public static FTPClient ftp;
static String ftpHost = "ftpIP";
static int ftpPort = ftp端口;//默認21
static String ftpUserName = "ftp用戶名";
static String ftpPassword = "ftp密碼";
public static boolean uploadFile(String originFileName, InputStream input,String basePath){
boolean success = false;
FTPClient ftp = new FTPClient();
ftp.setControlEncoding("GBK");
try {
int reply;
ftp.connect(ftpHost, ftpPort);// 連接FTP服務器
ftp.login(ftpUserName, ftpPassword);// 登錄
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return success;
}
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.makeDirectory(basePath);
ftp.changeWorkingDirectory(basePath);
ftp.storeFile(originFileName,input);
input.close();
ftp.logout();
success = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
/**
* 從ftp中下載文件
* @param path
* ftp文件路徑
* @param fileName
* ftp文件名
* @return
*/
public static InputStream downFile(String path, String fileName) {
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(ftpHost, ftpPort);// 連接FTP服務器
ftp.login(ftpUserName, ftpPassword);// 登錄
// ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
// 說明連接成功
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return null;
}
ftp.changeWorkingDirectory(path);// 轉移到FTP服務器目錄
ftp.setControlEncoding("GBK");
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
// 解決下載文件 中文名字亂碼
/*String gbk = new String(ff.getName().getBytes("UTF-8"), "GBK");*/
if (ff.getName().equals(fileName)) {
/*String name = new String(ff.getName().getBytes("iso-8859-1"), "UTF-8");*/
return ftp.retrieveFileStream(new String(ff.getName().getBytes("gbk"),"iso-8859-1"));
}
}
ftp.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return null;
}
/**
* Description: 從FTP服務器下載文件
*
* @param basePath ftp上要下載的文件的路徑
* 例如:dailyfile/2020/01/01/data.txt 傳dailyfile/2020/01/01/
* @param fileName
* 例如:data.txt
* @param localPath
* 例如:D:/
* @return
*/
public static boolean downloadFile(String basePath,String fileName, String localPath) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(ftpHost, ftpPort);// 連接FTP服務器
ftp.login(ftpUserName, ftpPassword);// 登錄
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
ftp.changeWorkingDirectory(basePath);// 轉移到FTP服務器目錄
// ftp.retrieveFile();
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(fileName)) {
InputStream inputStream = ftp.retrieveFileStream(new String(ff.getName().getBytes("gbk"),"iso-8859-1"));
File localFile = new File(localPath + "/" + ff.getName());
OutputStream is = new FileOutputStream(localFile);
byte[] b = new byte[1024];
int length;
while ((length = inputStream.read(b)) > 0) {
is.write(b, 0, length);
}
//ftp.retrieveFile(ff.getName(), is);
is.close();
}
}
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
public static void main(String[] args) {
downloadFile("dailyfile/2020/01/01/","data.txt","D:/");
}
}
注意: changeWorkingDirectory方法第二次執行的時候 是以第一次執行的時候爲基礎的。
例:第一次ftp.changeWorkingDirectory("dailyfile/"),
如果要到目錄dailyfile/2019/ 就要執行ftp.changeWorkingDirectory("2019/") 而不能
執行ftp.changeWorkingDirectory("dailyfile/2019/")
如果硬要執行 ftp.changeWorkingDirectory("dailyfile/2019/") 則先ftp.changeToParentDirectory();回到父目錄