Java實現(xiàn)跨服務器上傳文件功能
前幾天做個項目,本身客戶端和管理員端是寫在一起的,共用一臺服務器,客戶上傳的文件都是存在服務器的硬盤上的。老龍?zhí)岢鲆芽蛻舳撕凸芾韱T端分離,這時候用戶上傳的附件的存儲就出現(xiàn)問題了。顯然,把大到幾百M的apk文件存到數(shù)據庫不現(xiàn)實,查了半天,在兩端建立ftp服務器傳文件是最快的方法。
具體流程是,用戶登錄外網客戶端,上傳文件到外網的服務器硬盤上,在此同時,文件通過外網服務器訪問內網管理員服務器的ftp服務器,傳到內網服務器的硬盤上。這樣內網服務器可以對上傳的文件進行加密簽名工作,之后也通過ftp的方式把文件回傳到外網服務器硬盤上,供用戶進行其他操作。
具體實現(xiàn)時用到的工具:Serv-U。Serv-U是一個方便我們在windows上建立ftp服務器的工具。下載破解后,按照步驟,設置好Ip、端口、賬戶密碼、允許ftp訪問的磁盤路徑、操作權限等,就可以使用了。IP在本機測試的時候就選127.0.0.1,內網測試時就選192.168.0.x。
在java項目中的實現(xiàn),我自己寫了個工具類,用到了apache的commons-net包,有上傳,下載以及刪除功能。附上代碼:
package app.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.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
/**
* FTP服務器工具類
*
*/
public class FTPUtils {
/**
* 上傳文件至FTP服務器
*
* @param url
* 服務器IP地址
* @param port
* 服務器端口
* @param userName
* 用戶登錄名
* @param password
* 用戶登錄密碼
* @param storePath
* 服務器文件存儲路徑
* @param fileName
* 服務器文件存儲名稱
* @param is
* 文件輸入流
* @return
* <b>true</b>:上傳成功
* <br/>
* <b>false</b>:上傳失敗
*/
public static boolean storeFile (String url, int port, String userName, String password, String storePath, String fileName, InputStream is) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
// 連接至服務器,端口默認為21時,可直接通過URL連接
ftp.connect(url ,port);
// 登錄服務器
ftp.login(userName, password);
// 判斷返回碼是否合法
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
// 不合法時斷開連接
ftp.disconnect();
// 結束程序
return result;
}
// 判斷ftp目錄是否存在,如果不存在則創(chuàng)建目錄,包括創(chuàng)建多級目錄
String s = "/"+storePath;
String[] dirs = s.split("/");
ftp.changeWorkingDirectory("/");
//按順序檢查目錄是否存在,不存在則創(chuàng)建目錄
for(int i=1; dirs!=null&&i<dirs.length; i++) {
if(!ftp.changeWorkingDirectory(dirs[i])) {
if(ftp.makeDirectory(dirs[i])) {
if(!ftp.changeWorkingDirectory(dirs[i])) {
return false;
}
}else {
return false;
}
}
}
// 設置文件操作目錄
ftp.changeWorkingDirectory(storePath);
// 設置文件類型,二進制
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
// 設置緩沖區(qū)大小
ftp.setBufferSize(3072);
// 上傳文件
result = ftp.storeFile(fileName, is);
// 關閉輸入流
is.close();
// 登出服務器
ftp.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 判斷輸入流是否存在
if (null != is) {
// 關閉輸入流
is.close();
}
// 判斷連接是否存在
if (ftp.isConnected()) {
// 斷開連接
ftp.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
/**
* 從FTP服務器下載文件至本地
*
* @param url
* 服務器IP地址
* @param port
* 服務器端口
* @param userName
* 用戶登錄名
* @param password
* 用戶登錄密碼
* @param remotePath
* 服務器文件存儲路徑
* @param fileName
* 服務器文件存儲名稱
* @param localPath
* 本地文件存儲路徑
* @return
* <b>true</b>:下載成功
* <br/>
* <b>false</b>:下載失敗
*/
public static boolean retrieveFile (String url, int port, String userName, String password, String remotePath, String fileName, String localPath) {
boolean result = false;
FTPClient ftp = new FTPClient();
OutputStream os = null;
try {
// 連接至服務器,端口默認為21時,可直接通過URL連接
ftp.connect(url ,port);
// 登錄服務器
ftp.login(userName, password);
// 判斷返回碼是否合法
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
// 不合法時斷開連接
ftp.disconnect();
// 結束程序
return result;
}
// 設置文件操作目錄
ftp.changeWorkingDirectory(remotePath);
// 設置文件類型,二進制
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
// 設置緩沖區(qū)大小
ftp.setBufferSize(3072);
// 設置字符編碼
ftp.setControlEncoding("UTF-8");
// 構造本地文件對象
File localFile = new File(localPath + "/" + fileName);
// 獲取文件操作目錄下所有文件名稱
String[] remoteNames = ftp.listNames();
// 循環(huán)比對文件名稱,判斷是否含有當前要下載的文件名
for (String remoteName: remoteNames) {
if (fileName.equals(remoteName)) {
result = true;
}
}
// 文件名稱比對成功時,進入下載流程
if (result) {
// 構造文件輸出流
os = new FileOutputStream(localFile);
// 下載文件
result = ftp.retrieveFile(fileName, os);
// 關閉輸出流
os.close();
}
// 登出服務器
ftp.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 判斷輸出流是否存在
if (null != os) {
// 關閉輸出流
os.close();
}
// 判斷連接是否存在
if (ftp.isConnected()) {
// 斷開連接
ftp.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
/**
* 從FTP服務器刪除文件
*
* @param url
* 服務器IP地址
* @param port
* 服務器端口
* @param userName
* 用戶登錄名
* @param password
* 用戶登錄密碼
* @param remotePath
* 服務器文件存儲路徑
* @param fileName
* 服務器文件存儲名稱
* @return
* <b>true</b>:刪除成功
* <br/>
* <b>false</b>:刪除失敗
*/
public static boolean deleteFile (String url, int port, String userName, String password, String remotePath, String fileName) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
// 連接至服務器,端口默認為21時,可直接通過URL連接
ftp.connect(url ,port);
// 登錄服務器
ftp.login(userName, password);
// 判斷返回碼是否合法
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
// 不合法時斷開連接
ftp.disconnect();
// 結束程序
return result;
}
// 設置文件操作目錄
ftp.changeWorkingDirectory(remotePath);
// 設置文件類型,二進制
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
// 設置緩沖區(qū)大小
ftp.setBufferSize(3072);
// 設置字符編碼
ftp.setControlEncoding("UTF-8");
// 獲取文件操作目錄下所有文件名稱
String[] remoteNames = ftp.listNames();
// 循環(huán)比對文件名稱,判斷是否含有當前要下載的文件名
for (String remoteName: remoteNames) {
if (fileName.equals(remoteName)) {
result = true;
}
}
// 文件名稱比對成功時,進入刪除流程
if (result) {
// 刪除文件
result = ftp.deleteFile(fileName);
}
// 登出服務器
ftp.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 判斷連接是否存在
if (ftp.isConnected()) {
// 斷開連接
ftp.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
public static void main(String[] args) throws FileNotFoundException {
// try {
// FileInputStream fis = new FileInputStream(new File("D:/Soft Storage/軟件工具箱/HTML_Help_WorkShop_1.3_XiaZaiBa.zip"));
// System.out.println(storeFile("192.168.1.2", 21, "admin", "1", "C:/Documents and Settings/Administrator/桌面", RandomUUID.random() + ".zip", fis));
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// }
//
//File file = new File("C:/Users/freed/Desktop/1.txt");
//InputStream is = new FileInputStream(file);
//System.out.println(storeFile("127.0.0.1", 21, "feili", "feili", "examples", "2.txt", is));
//System.out.println(retrieveFile("127.0.0.1", 21, "feili", "feili", "examples/jsp", "index.html", "C:/Users/freed/Desktop"));
//System.out.println(deleteFile("127.0.0.1", 21, "feili", "feili", "testpath", "1.txt"));
}
}
需要注意的是上傳文件的時候要將File文件先放入fileinputstream中。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot整合Java DL4J實現(xiàn)文本分類系統(tǒng)
在當今信息爆炸的時代,自然語言處理領域中的文本分類顯得尤為重要,文本分類能夠高效地組織和管理海量的文本數(shù)據,隨著互聯(lián)網的飛速發(fā)展,我們每天都被大量的文本信息所包圍,本文將介紹如何使用 Spring Boot 整合 Java Deeplearning4j 來構建一個文本分類系統(tǒng)2024-10-10
springboot整合Quartz實現(xiàn)動態(tài)配置定時任務的方法
本篇文章主要介紹了springboot整合Quartz實現(xiàn)動態(tài)配置定時任務的方法,非常具有實用價值,需要的朋友可以參考下2017-10-10
SpringSecurity 手機號登錄功能實現(xiàn)
這篇文章主要介紹了SpringSecurity 手機號登錄功能實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧2023-12-12
Mybatis plus的自動填充與樂觀鎖的實例詳解(springboot)
這篇文章主要介紹了Mybatis plus的自動填充與樂觀鎖的實例詳解(springboot),本文給大家介紹的非常詳細對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11

