Java 實現(xiàn)FTP服務實例詳解
Java 實現(xiàn)FTP服務實例詳解
1、FTP簡介
FTP 是File Transfer Protocol(文件傳輸協(xié)議)的英文簡稱,而中文簡稱為“文傳協(xié)議”。用于Internet上的控制文件的雙向傳輸。同時,它也是一個應用程序(Application)?;诓煌牟僮飨到y(tǒng)有不同的FTP應用程序,而所有這些應用程序都遵守同一種協(xié)議以傳輸文件。在FTP的使用當中,用戶經常遇到兩個概念:"下載"(Download)和"上傳"(Upload)。"下載"文件就是從遠程主機拷貝文件至自己的計算機上;"上傳"文件就是將文件從自己的計算機中拷貝至遠程主機上。用Internet語言來說,用戶可通過客戶機程序向(從)遠程主機上傳(下載)文件。
2、實例
2.1、添加依賴
<!-- 文件上傳組件 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> </dependency>
2.2測試類
package testController;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.chenzhengyou.common.util.FtpUtil;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
/**
* @auther 陳鄭游
* @create 2016-11-23-19:27
* @功能描述 圖片測試
* @公司地址
*/
public class FtpController {
//主機地址 端口號
private String HOSTNAME = "127.0.0.1";
private Integer PORT = 21;
//本地圖片路徑
private String FilePackage = "F:\\Programming_Package\\IMG_3733_1.JPG";
//用戶名 密碼
private String USERNAME = "czy";
private String PASSWORD = "czy";
/**
* 無工具類圖片測試
* */
@Test
public void testFtp() throws Exception {
//創(chuàng)建一個FtpClient對象
FTPClient ftpClient = new FTPClient();
//創(chuàng)建ftp連接。默認是21端口
ftpClient.connect(HOSTNAME,PORT);
//登錄ftp服務器,使用用戶名和密碼
ftpClient.login(USERNAME,PASSWORD);
//上傳文件。
//讀取本地文件
FileInputStream inputStream = new FileInputStream(new File(FilePackage));
//設置上傳的路徑
ftpClient.changeWorkingDirectory("/myftp/images");
//修改上傳文件的格式
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
//第一個參數(shù):服務器端文檔名
//第二個參數(shù):上傳文檔的inputStream
ftpClient.storeFile("hello.jpg", inputStream);
//關閉連接
ftpClient.logout();
}
}
2.3、FTP工具類上傳圖片
工具類
package org.chenzhengyou.common.util;
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;
import java.io.*;
/**
* @auther 陳鄭游
* @create 2016-11-23-19:27
* @功能描述 ftp工具類
* @公司地址
*/
public class FtpUtil {
/**
* Description: 向FTP服務器上傳文件
* @param host FTP服務器hostname
* @param port FTP服務器端口
* @param username FTP登錄賬號
* @param password FTP登錄密碼
* @param basePath FTP服務器基礎目錄
* @param filePath FTP服務器文件存放路徑。例如分日期存放:/2015/01/01。文件的路徑為basePath+filePath
* @param filename 上傳到FTP服務器上的文件名
* @param input 輸入流
* @return 成功返回true,否則返回false
*/
public static boolean uploadFile(String host, int port, String username,
String password, String basePath,
String filePath, String filename, InputStream input) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);// 連接FTP服務器
// 如果采用默認端口,可以使用ftp.connect(host)的方式直接連接FTP服務器
ftp.login(username, password);// 登錄
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
//切換到上傳目錄
if (!ftp.changeWorkingDirectory(basePath+filePath)) {
//如果目錄不存在創(chuàng)建目錄
String[] dirs = filePath.split("/");
String tempPath = basePath;
for (String dir : dirs) {
if (null == dir || "".equals(dir)) continue;
tempPath += "/" + dir;
if (!ftp.changeWorkingDirectory(tempPath)) {
if (!ftp.makeDirectory(tempPath)) {
return result;
} else {
ftp.changeWorkingDirectory(tempPath);
}
}
}
}
//設置上傳文件的類型為二進制類型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//上傳文件
if (!ftp.storeFile(filename, input)) {
return result;
}
input.close();
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
/**
* Description: 從FTP服務器下載文件
* @param host FTP服務器hostname
* @param port FTP服務器端口
* @param username FTP登錄賬號
* @param password FTP登錄密碼
* @param remotePath FTP服務器上的相對路徑
* @param fileName 要下載的文件名
* @param localPath 下載后保存到本地的路徑
* @return
*/
public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
String fileName, String localPath) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);
// 如果采用默認端口,可以使用ftp.connect(host)的方式直接連接FTP服務器
ftp.login(username, password);// 登錄
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
ftp.changeWorkingDirectory(remotePath);// 轉移到FTP服務器目錄
FTPFile[] fs = ftp.listFiles();
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();
}
}
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
}
實現(xiàn)類
package testController;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.chenzhengyou.common.util.FtpUtil;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
/**
* @auther 陳鄭游
* @create 2016-11-23-19:27
* @功能描述 圖片測試
* @公司地址
*/
public class FtpController {
//主機地址 端口號
private String HOSTNAME = "127.0.0.1";
private Integer PORT = 21;
//本地圖片路徑
private String FilePackage = "F:\\Programming_Package\\IMG_3733_1.JPG";
//用戶名 密碼
private String USERNAME = "czy";
private String PASSWORD = "czy";
/**
* 有工具類測試
* */
@Test
public void testUtil() throws Exception {
FileInputStream inputStream = new FileInputStream(new File("F:\\Programming_Package\\IMG_3733_1.JPG"));
FtpUtil.uploadFile(HOSTNAME,PORT, USERNAME, PASSWORD, "/myftp/images", "/2016/11/24", "hello.jpg", inputStream);
}
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
SpringMVC+Spring+Mybatis實現(xiàn)支付寶支付功能的示例代碼
這篇文章主要介紹了SpringMVC+Spring+Mybatis實現(xiàn)支付寶支付功能的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-05-05
SpringBoot+layui實現(xiàn)文件上傳功能
Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發(fā)過程。這篇文章主要介紹了SpringBoot+layui實現(xiàn)文件上傳,需要的朋友可以參考下2018-09-09
Java HttpClient實現(xiàn)socks代理的示例代碼
這篇文章主要介紹了Java HttpClient 實現(xiàn) socks 代理的示例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11
使用list stream:對List中的對象先進行排序再獲取前n個對象
這篇文章主要介紹了使用list stream:對List中的對象先進行排序再獲取前n個對象,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Java char[]數(shù)組轉成String類型詳細介紹
這篇文章詳細介紹了Java char[]數(shù)組轉成String類型(char to String)的方法,文章中有詳細的代碼示例,需要的朋友可以參考閱讀2023-04-04

