Java實(shí)現(xiàn)跨服務(wù)器上傳文件功能
前幾天做個項(xiàng)目,本身客戶端和管理員端是寫在一起的,共用一臺服務(wù)器,客戶上傳的文件都是存在服務(wù)器的硬盤上的。老龍?zhí)岢鲆芽蛻舳撕凸芾韱T端分離,這時候用戶上傳的附件的存儲就出現(xiàn)問題了。顯然,把大到幾百M(fèi)的apk文件存到數(shù)據(jù)庫不現(xiàn)實(shí),查了半天,在兩端建立ftp服務(wù)器傳文件是最快的方法。
具體流程是,用戶登錄外網(wǎng)客戶端,上傳文件到外網(wǎng)的服務(wù)器硬盤上,在此同時,文件通過外網(wǎng)服務(wù)器訪問內(nèi)網(wǎng)管理員服務(wù)器的ftp服務(wù)器,傳到內(nèi)網(wǎng)服務(wù)器的硬盤上。這樣內(nèi)網(wǎng)服務(wù)器可以對上傳的文件進(jìn)行加密簽名工作,之后也通過ftp的方式把文件回傳到外網(wǎng)服務(wù)器硬盤上,供用戶進(jìn)行其他操作。
具體實(shí)現(xiàn)時用到的工具:Serv-U。Serv-U是一個方便我們在windows上建立ftp服務(wù)器的工具。下載破解后,按照步驟,設(shè)置好Ip、端口、賬戶密碼、允許ftp訪問的磁盤路徑、操作權(quán)限等,就可以使用了。IP在本機(jī)測試的時候就選127.0.0.1,內(nèi)網(wǎng)測試時就選192.168.0.x。
在java項(xiàng)目中的實(shí)現(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服務(wù)器工具類 * */ public class FTPUtils { /** * 上傳文件至FTP服務(wù)器 * * @param url * 服務(wù)器IP地址 * @param port * 服務(wù)器端口 * @param userName * 用戶登錄名 * @param password * 用戶登錄密碼 * @param storePath * 服務(wù)器文件存儲路徑 * @param fileName * 服務(wù)器文件存儲名稱 * @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 { // 連接至服務(wù)器,端口默認(rèn)為21時,可直接通過URL連接 ftp.connect(url ,port); // 登錄服務(wù)器 ftp.login(userName, password); // 判斷返回碼是否合法 if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { // 不合法時斷開連接 ftp.disconnect(); // 結(jié)束程序 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; } } } // 設(shè)置文件操作目錄 ftp.changeWorkingDirectory(storePath); // 設(shè)置文件類型,二進(jìn)制 ftp.setFileType(FTPClient.BINARY_FILE_TYPE); // 設(shè)置緩沖區(qū)大小 ftp.setBufferSize(3072); // 上傳文件 result = ftp.storeFile(fileName, is); // 關(guān)閉輸入流 is.close(); // 登出服務(wù)器 ftp.logout(); } catch (IOException e) { e.printStackTrace(); } finally { try { // 判斷輸入流是否存在 if (null != is) { // 關(guān)閉輸入流 is.close(); } // 判斷連接是否存在 if (ftp.isConnected()) { // 斷開連接 ftp.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return result; } /** * 從FTP服務(wù)器下載文件至本地 * * @param url * 服務(wù)器IP地址 * @param port * 服務(wù)器端口 * @param userName * 用戶登錄名 * @param password * 用戶登錄密碼 * @param remotePath * 服務(wù)器文件存儲路徑 * @param fileName * 服務(wù)器文件存儲名稱 * @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 { // 連接至服務(wù)器,端口默認(rèn)為21時,可直接通過URL連接 ftp.connect(url ,port); // 登錄服務(wù)器 ftp.login(userName, password); // 判斷返回碼是否合法 if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { // 不合法時斷開連接 ftp.disconnect(); // 結(jié)束程序 return result; } // 設(shè)置文件操作目錄 ftp.changeWorkingDirectory(remotePath); // 設(shè)置文件類型,二進(jìn)制 ftp.setFileType(FTPClient.BINARY_FILE_TYPE); // 設(shè)置緩沖區(qū)大小 ftp.setBufferSize(3072); // 設(shè)置字符編碼 ftp.setControlEncoding("UTF-8"); // 構(gòu)造本地文件對象 File localFile = new File(localPath + "/" + fileName); // 獲取文件操作目錄下所有文件名稱 String[] remoteNames = ftp.listNames(); // 循環(huán)比對文件名稱,判斷是否含有當(dāng)前要下載的文件名 for (String remoteName: remoteNames) { if (fileName.equals(remoteName)) { result = true; } } // 文件名稱比對成功時,進(jìn)入下載流程 if (result) { // 構(gòu)造文件輸出流 os = new FileOutputStream(localFile); // 下載文件 result = ftp.retrieveFile(fileName, os); // 關(guān)閉輸出流 os.close(); } // 登出服務(wù)器 ftp.logout(); } catch (IOException e) { e.printStackTrace(); } finally { try { // 判斷輸出流是否存在 if (null != os) { // 關(guān)閉輸出流 os.close(); } // 判斷連接是否存在 if (ftp.isConnected()) { // 斷開連接 ftp.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return result; } /** * 從FTP服務(wù)器刪除文件 * * @param url * 服務(wù)器IP地址 * @param port * 服務(wù)器端口 * @param userName * 用戶登錄名 * @param password * 用戶登錄密碼 * @param remotePath * 服務(wù)器文件存儲路徑 * @param fileName * 服務(wù)器文件存儲名稱 * @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 { // 連接至服務(wù)器,端口默認(rèn)為21時,可直接通過URL連接 ftp.connect(url ,port); // 登錄服務(wù)器 ftp.login(userName, password); // 判斷返回碼是否合法 if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { // 不合法時斷開連接 ftp.disconnect(); // 結(jié)束程序 return result; } // 設(shè)置文件操作目錄 ftp.changeWorkingDirectory(remotePath); // 設(shè)置文件類型,二進(jìn)制 ftp.setFileType(FTPClient.BINARY_FILE_TYPE); // 設(shè)置緩沖區(qū)大小 ftp.setBufferSize(3072); // 設(shè)置字符編碼 ftp.setControlEncoding("UTF-8"); // 獲取文件操作目錄下所有文件名稱 String[] remoteNames = ftp.listNames(); // 循環(huán)比對文件名稱,判斷是否含有當(dāng)前要下載的文件名 for (String remoteName: remoteNames) { if (fileName.equals(remoteName)) { result = true; } } // 文件名稱比對成功時,進(jìn)入刪除流程 if (result) { // 刪除文件 result = ftp.deleteFile(fileName); } // 登出服務(wù)器 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中。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java實(shí)現(xiàn)圖片上傳到服務(wù)器并把上傳的圖片讀取出來
- JAVA技術(shù)實(shí)現(xiàn)上傳下載文件到FTP服務(wù)器(完整)
- Java實(shí)現(xiàn)文件上傳至服務(wù)器的方法
- Java實(shí)現(xiàn)上傳文件圖片到指定服務(wù)器目錄
- 基于HTML5+js+Java實(shí)現(xiàn)單文件文件上傳到服務(wù)器功能
- Java通過FTP服務(wù)器上傳下載文件的方法
- Android實(shí)現(xiàn)上傳圖片至java服務(wù)器
- java實(shí)現(xiàn)上傳文件到服務(wù)器和客戶端
- Java如何實(shí)現(xiàn)上傳文件到服務(wù)器指定目錄
- java實(shí)現(xiàn)文件上傳到服務(wù)器
相關(guān)文章
mac下修改idea的jvm運(yùn)行參數(shù)解決idea卡頓的情況
這篇文章主要介紹了mac下修改idea的jvm運(yùn)行參數(shù)解決idea卡頓的情況,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12Java經(jīng)典排序算法之歸并排序?qū)崿F(xiàn)代碼
這篇文章主要介紹了Java經(jīng)典排序算法之歸并排序?qū)崿F(xiàn)代碼,歸并排序是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法的一個非常典型的應(yīng)用,將已有序的子序列合并,得到完全有序的序列,需要的朋友可以參考下2023-10-10Mybatis的@select和@SelectProvider注解方式動態(tài)SQL語句解讀
這篇文章主要介紹了Mybatis的@select和@SelectProvider注解方式動態(tài)SQL語句,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12