在過去的幾年工作中,曾經多次需要把文件上傳到單獨的服務器,而程序是在單獨的服務器上部署的,在進行文件操作的時候就需要跨服務器進行操作包括:文件上傳、文件下載、文件刪除等。跨服務器文件操作一般是需要FTP協議和SFTP協議兩種,現在就通過Java實現FTP協議的文件上傳。要實現FTP操作文件需要引入jar包: commons-net-1.4.1.jar
具體代碼如下:
import java.io.*;
import java.net.MalformedURLException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
/**
* ftp 文件上傳工具類
* 所需jar包(commons-net-1.4.1.jar)
*/
public class FtpUtils {
//ftp服務器地址
public String hostname ;
//ftp服務器端口號默認為21
public Integer port ;
//ftp登錄賬號
public String username ;
//ftp登錄密碼
public String password ;
//FTP客戶端對象
public FTPClient ftpClient = null;
//構造方法
public FtpUtils(String hostname,Integer port,String username,String password){
this.hostname = hostname;
this.port = port;
this.username = username;
this.password = password;
}
/**
* 初始化ftp服務器
*/
public void initFtpClient() {
ftpClient = new FTPClient();
ftpClient.setControlEncoding("utf-8");
try {
System.out.println("connecting...ftp服務器:"+this.hostname+":"+this.port);
ftpClient.connect(hostname, port); //連接ftp服務器
ftpClient.login(username, password); //登錄ftp服務器
int replyCode = ftpClient.getReplyCode(); //是否成功登錄服務器
if(!FTPReply.isPositiveCompletion(replyCode)){
System.out.println("connect failed...ftp服務器:"+this.hostname+":"+this.port);
}
System.out.println("connect successfu...ftp服務器:"+this.hostname+":"+this.port);
}catch (MalformedURLException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
/**
* 上傳文件
* @param pathname ftp服務保存地址
* @param fileName 上傳到ftp的文件名
* @param originfilename 待上傳文件的名稱(絕對地址) *
* @return
*/
public boolean uploadFile( String pathname, String fileName,String originfilename){
boolean flag = false;
InputStream inputStream = null;
try{
System.out.println("開始上傳文件");
inputStream = new FileInputStream(new File(originfilename));
initFtpClient();
ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
CreateDirecroty(pathname);
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);
ftpClient.enterLocalPassiveMode();
flag =ftpClient.storeFile(fileName, inputStream);
inputStream.close();
ftpClient.logout();
System.out.println("上傳文件成功");
}catch (Exception e) {
System.out.println("上傳文件失敗");
e.printStackTrace();
}finally{
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
/**
* 上傳文件
* @param pathname ftp服務保存地址
* @param fileName 上傳到ftp的文件名
* @param inputStream 待上傳文件輸入流 *
* @return
*/
public boolean uploadFileByInputStream( String pathname, String fileName,InputStream inputStream){
boolean flag = false;
try{
System.out.println("開始上傳文件");
initFtpClient();
ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
CreateDirecroty(pathname);
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);
ftpClient.enterLocalPassiveMode();
flag =ftpClient.storeFile(fileName, inputStream);
inputStream.close();
ftpClient.logout();
System.out.println("上傳文件成功");
}catch (Exception e) {
System.out.println("上傳文件失敗");
e.printStackTrace();
}finally{
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
/**
* 上傳文件
* @param pathname ftp服務保存地址
* @param fileName 上傳到ftp的文件名
* @param inputStream 輸入文件流
* @return
*/
public boolean uploadFile( String pathname, String fileName,InputStream inputStream){
boolean flag = false;
try{
System.out.println("開始上傳文件");
initFtpClient();
ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
CreateDirecroty(pathname);
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);
ftpClient.enterLocalPassiveMode();
flag = ftpClient.storeFile(fileName, inputStream);
inputStream.close();
ftpClient.logout();
System.out.println("上傳文件成功");
}catch (Exception e) {
System.out.println("上傳文件失敗");
e.printStackTrace();
}finally{
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
/**
* 改變目錄路徑
* @param directory
* @return
*/
public boolean changeWorkingDirectory(String directory) {
boolean flag = true;
try {
flag = ftpClient.changeWorkingDirectory(directory);
if (flag) {
System.out.println("進入文件夾" + directory + " 成功!");
} else {
System.out.println("進入文件夾" + directory + " 失敗!開始創建文件夾");
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
return flag;
}
/**
* 創建多層目錄文件,如果有ftp服務器已存在該文件,則不創建,如果無,則創建
* @param remote
* @return
* @throws IOException
*/
public boolean CreateDirecroty(String remote) throws IOException {
boolean success = true;
String directory = remote + "/";
// 如果遠程目錄不存在,則遞歸創建遠程服務器目錄
if (!directory.equalsIgnoreCase("/") && !changeWorkingDirectory(new String(directory))) {
int start = 0;
int end = 0;
if (directory.startsWith("/")) {
start = 1;
} else {
start = 0;
}
end = directory.indexOf("/", start);
String path = "";
String paths = "";
while (true) {
String subDirectory = new String(remote.substring(start, end).getBytes("GBK"), "iso-8859-1");
path = path + "/" + subDirectory;
if (!existFile(path)) {
if (makeDirectory(subDirectory)) {
changeWorkingDirectory(subDirectory);
} else {
changeWorkingDirectory(subDirectory);
}
} else {
changeWorkingDirectory(subDirectory);
}
paths = paths + "/" + subDirectory;
start = end + 1;
end = directory.indexOf("/", start);
// 檢查所有目錄是否創建完畢
if (end <= start) {
break;
}
}
}
return success;
}
/**
* 判斷ftp服務器文件是否存在
* @param path
* @return
* @throws IOException
*/
public boolean existFile(String path) throws IOException {
boolean flag = false;
FTPFile[] ftpFileArr = ftpClient.listFiles(path);
if (ftpFileArr.length > 0) {
flag = true;
}
return flag;
}
/**
* 創建目錄
* @param dir
* @return
*/
public boolean makeDirectory(String dir) {
boolean flag = true;
try {
flag = ftpClient.makeDirectory(dir);
if (flag) {
System.out.println("創建文件夾" + dir + " 成功!");
} else {
System.out.println("創建文件夾" + dir + " 失敗!");
}
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/** * 下載文件 *
* @param pathname FTP服務器文件目錄 *
* @param filename 文件名稱 *
* @param localpath 下載后的文件路徑 *
* @return */
public boolean downloadFile(String pathname, String filename, String localpath){
boolean flag = false;
OutputStream os=null;
try {
System.out.println("開始下載文件");
initFtpClient();
ftpClient.enterLocalPassiveMode();
//切換FTP目錄
ftpClient.changeWorkingDirectory(pathname);
FTPFile[] ftpFiles = ftpClient.listFiles();
for(FTPFile file : ftpFiles){
if(filename.equalsIgnoreCase(file.getName())){
File localFile = new File(localpath + "/" + file.getName());
os = new FileOutputStream(localFile);
flag = ftpClient.retrieveFile(file.getName(), os);
os.close();
}
}
ftpClient.logout();
System.out.println("下載文件成功");
} catch (Exception e) {
System.out.println("下載文件失敗");
e.printStackTrace();
} finally{
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != os){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
/** * 下載文件 *
* @param pathname FTP服務器文件目錄 *
* @param filename 文件名稱 *
* @param localpath 下載后的文件路徑 *
* @return */
public boolean downloadFile(String pathname, String filename,String dbFilename, String localpath){
boolean flag = false;
OutputStream os=null;
try {
System.out.println("開始下載文件");
initFtpClient();
//切換FTP目錄
ftpClient.changeWorkingDirectory(pathname);
ftpClient.enterLocalPassiveMode();
FTPFile[] ftpFiles = ftpClient.listFiles();
for(FTPFile file : ftpFiles){
if(filename.equalsIgnoreCase(file.getName())){
File localFile = new File(localpath + "/" + dbFilename);
os = new FileOutputStream(localFile);
flag = ftpClient.retrieveFile(file.getName(), os);
os.close();
}
}
ftpClient.logout();
flag = true;
System.out.println("下載文件成功");
} catch (Exception e) {
System.out.println("下載文件失敗");
e.printStackTrace();
} finally{
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != os){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
/** * 獲取ftp文件輸入流 *
* @param pathname FTP服務器文件目錄 *
* @param filename 文件名稱 *
* @return */
public InputStream downloadFile(String pathname, String filename){
InputStream fileStream = null;
try {
initFtpClient();
//切換FTP目錄
ftpClient.changeWorkingDirectory(pathname);
FTPFile[] ftpFiles = ftpClient.listFiles();
for(FTPFile file : ftpFiles){
if(filename.equalsIgnoreCase(file.getName())){
ftpClient.enterLocalPassiveMode();
fileStream = ftpClient.retrieveFileStream(new String(file.getName().getBytes("GBK"),"ISO8859-1"));
break;
}
}
ftpClient.logout();
} catch (Exception e) {
System.out.println("獲取下載的文件流");
e.printStackTrace();
} finally{
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
}
return fileStream;
}
/** * 刪除文件 *
* @param pathname FTP服務器保存目錄 *
* @param filename 要刪除的文件名稱 *
* @return */
public boolean deleteFile(String pathname, String filename){
boolean flag = false;
try {
System.out.println("開始刪除文件");
initFtpClient();
//切換FTP目錄
ftpClient.changeWorkingDirectory(pathname);
ftpClient.enterLocalPassiveMode();
ftpClient.dele(filename);
ftpClient.logout();
flag = true;
System.out.println("刪除文件成功");
} catch (Exception e) {
System.out.println("刪除文件失敗");
e.printStackTrace();
} finally {
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
}
return flag;
}
/**
* 測試
* @param args
*/
public static void main(String[] args) {
FtpUtils ftp =new FtpUtils("192.168.1.123",21,"aaa","aa123");
//ftp.downloadFile("ftpFile/ss/model", "ceshi.xlsx","E:/abc");
//ftp.deleteFile("ftpFile/ss/model","ceshi.txt");
/*InputStream inputStream = null;
try {
inputStream = new FileInputStream(new File("E:/abc/abc.txt"));
ftp.uploadFileByInputStream("ftpFile/ss/model", "abc.txt", inputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}*/
boolean flag = ftp.uploadFile( "/", "bbb.txt","E:/abc/bbb.txt");
System.out.println(flag);
/*InputStream downloadFile = ftp.downloadFile("/home/aaa/ftpFile/data/policy/model", "Report1.doc");
System.out.println(downloadFile);
FtpUtils _ftp =new FtpUtils("192.168.1.123",21,"aaa","aa123");
_ftp.uploadFile("ftpFile/data/model","Report1.doc", downloadFile);*/
//ftp.downloadFile("ftpFile/data/policy/model", "Report1.doc","2e0ee9b1476c4bd3bb0cad5ecef6d4c3.pdf", "D:/test/uploadfile/modelfile/");
//ftp.deleteFile("ftpFile/data", "123.docx");
System.out.println("ok");
}
}