最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)跨服務(wù)器上傳文件功能

 更新時間:2018年01月13日 10:39:34   作者:Wu_Fei_Li  
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)跨服務(wù)器上傳文件功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前幾天做個項目,本身客戶端和管理員端是寫在一起的,共用一臺服務(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項目中的實(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot整合Java DL4J實(shí)現(xiàn)文本分類系統(tǒng)

    SpringBoot整合Java DL4J實(shí)現(xiàn)文本分類系統(tǒng)

    在當(dāng)今信息爆炸的時代,自然語言處理領(lǐng)域中的文本分類顯得尤為重要,文本分類能夠高效地組織和管理海量的文本數(shù)據(jù),隨著互聯(lián)網(wǎng)的飛速發(fā)展,我們每天都被大量的文本信息所包圍,本文將介紹如何使用 Spring Boot 整合 Java Deeplearning4j 來構(gòu)建一個文本分類系統(tǒng)
    2024-10-10
  • springboot整合Quartz實(shí)現(xiàn)動態(tài)配置定時任務(wù)的方法

    springboot整合Quartz實(shí)現(xiàn)動態(tài)配置定時任務(wù)的方法

    本篇文章主要介紹了springboot整合Quartz實(shí)現(xiàn)動態(tài)配置定時任務(wù)的方法,非常具有實(shí)用價值,需要的朋友可以參考下
    2017-10-10
  • Java實(shí)現(xiàn)Excel文件加密解密的示例代碼

    Java實(shí)現(xiàn)Excel文件加密解密的示例代碼

    設(shè)置excel文件保護(hù)時,通??蛇x擇對整個工作簿進(jìn)行加密保護(hù)。無需設(shè)置文檔保護(hù)時,可撤銷密碼保護(hù),即解密文檔。本文將通過java程序演示以上加密、解密方法的實(shí)現(xiàn),感興趣的可以了解一下
    2022-05-05
  • Mybatis使用@Select注解sql中使用in問題

    Mybatis使用@Select注解sql中使用in問題

    這篇文章主要介紹了Mybatis使用@Select注解sql中使用in問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 微服務(wù)架構(gòu)之使用RabbitMQ進(jìn)行異步處理方式

    微服務(wù)架構(gòu)之使用RabbitMQ進(jìn)行異步處理方式

    本文介紹了RabbitMQ的基本概念、異步調(diào)用處理邏輯、RabbitMQ的基本使用方法以及在Spring Boot項目中使用RabbitMQ解決高并發(fā)問題,RabbitMQ是一種流行的消息隊列實(shí)現(xiàn),支持異步通信,可以有效解耦應(yīng)用程序的不同部分,并將任務(wù)分發(fā)給多個消費(fèi)者
    2025-02-02
  • SpringSecurity 手機(jī)號登錄功能實(shí)現(xiàn)

    SpringSecurity 手機(jī)號登錄功能實(shí)現(xiàn)

    這篇文章主要介紹了SpringSecurity 手機(jī)號登錄功能實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2023-12-12
  • Mybatis plus的自動填充與樂觀鎖的實(shí)例詳解(springboot)

    Mybatis plus的自動填充與樂觀鎖的實(shí)例詳解(springboot)

    這篇文章主要介紹了Mybatis plus的自動填充與樂觀鎖的實(shí)例詳解(springboot),本文給大家介紹的非常詳細(xì)對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 一篇文章帶你了解spring事務(wù)失效的多種場景

    一篇文章帶你了解spring事務(wù)失效的多種場景

    在日常編碼過程中常常涉及到事務(wù),在前兩天看到一篇文章提到了Spring事務(wù),那么在此總結(jié)下在Spring環(huán)境下事務(wù)失效的幾種原因.
    2021-09-09
  • MyBatis與Hibernate的比較

    MyBatis與Hibernate的比較

    Hibernate 與Mybatis都是流行的持久層開發(fā)框架,但Hibernate開發(fā)社區(qū)相對多熱鬧些,支持的工具也多,更新也快,當(dāng)前最高版本4.1.8。而Mybatis相對平靜,工具較少,當(dāng)前最高版本3.2
    2016-01-01
  • Java Spring IOC圖文詳解

    Java Spring IOC圖文詳解

    IoC是一種讓服務(wù)消費(fèi)者不直接依賴于服務(wù)提供者的組件設(shè)計方式,是一種減少類與類之間依賴的設(shè)計原則。下面通過本文給大家分享spring中ioc的概念,感興趣的朋友一起看看吧
    2021-09-09

最新評論

墨江| 乌恰县| 喀喇| 沂南县| 建水县| 松潘县| 肇庆市| 建瓯市| 繁峙县| 凤山市| 华坪县| 屏山县| 高安市| 吴江市| 高台县| 麻江县| 大田县| 陈巴尔虎旗| 天峻县| 潢川县| 枣强县| 连州市| 和顺县| 阆中市| 洞口县| 丰台区| 贵港市| 怀来县| 隆回县| 甘肃省| 康平县| 确山县| 叶城县| 南昌县| 县级市| 广灵县| 宝丰县| 永川市| 巨鹿县| 五大连池市| 开化县|