<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          netty-file-parent文件上傳下載功能組件

          聯(lián)合創(chuàng)作 · 2023-09-21 19:10

          基于netty的文件上傳下載組件

          1.簡(jiǎn)介

          該組件基于netty3.6.3實(shí)現(xiàn),具有如下功能:文件上傳,文件替換,文件刪除,如果是圖片的話,還可以生成縮略圖等功能。
          使用簡(jiǎn)單,只需要引入netty-file-client,即可以實(shí)現(xiàn)文件的以上操作。
          該組件的代碼結(jié)構(gòu)分為兩部分,客戶端組件(netty-flie-client)和服務(wù)端組件(netty-flie-server)。如下圖所示:

           

          2.netty-file-client

          2.1 概述

          客戶端組件主要提供對(duì)外訪問服務(wù)端組件的接口,提供以下接口:文件上傳,文件替換,文件刪除,如果是圖片的話,還可以生成縮略圖等功能。代碼結(jié)構(gòu)如下:

          org.lyx.file.client包是該組件的核心包,F(xiàn)ileClient類是對(duì)外提供接口的工具類。具有以下方法:

          1. uploadFile 文件上傳,對(duì)應(yīng)文件處理句柄類為:UploadFileClientHandler

          2. deleteFile 刪除服務(wù)端文件,對(duì)應(yīng)文件處理句柄類為:DeleteFileClientHandler

          3. replaceFile 替換服務(wù)端文件,對(duì)應(yīng)文件處理句柄類為:ReplaceFileClientHandler

          4. createThumbPicture 生成縮略圖,對(duì)應(yīng)文件處理句柄類為:CreateThumbPictureClientHandler

          以上所有句柄類的父類均為UploadFileClientHandler,該類實(shí)現(xiàn)了一些共有方法,比如一些公共參數(shù)的包裝等。

          2.2 實(shí)現(xiàn)步驟

          實(shí)現(xiàn)步驟以上傳文件為例,其他類似實(shí)現(xiàn)。
          直接上代碼:

          /**
               * 文件上傳
               * @param file 需要上傳的文件
               * @param fileName 文件名稱
               * @param thumbMark 是否需要生成縮略圖
               * @return
               * @author:landyChris
               */
              public static String uploadFile(File file, String fileName,
                      boolean thumbMark) {
                  FileClientPipelineFactory clientPipelineFactory = new FileClientPipelineFactory();
                  //輔助類。用于幫助我們創(chuàng)建NETTY服務(wù)
                  ClientBootstrap bootstrap = createClientBootstrap(clientPipelineFactory);
                  String strThumbMark = Constants.THUMB_MARK_NO;
                  if (thumbMark) {
                      strThumbMark = Constants.THUMB_MARK_YES;
                  }
                  //具體處理上傳文件邏輯
                  uploadFile(bootstrap, FileClientContainer.getHost(),
                          FileClientContainer.getPort(), file, fileName, strThumbMark,
                          FileClientContainer.getUserName(),
                          FileClientContainer.getPassword());
                  Result result = clientPipelineFactory.getResult();
                  if ((result != null) && (result.isCode())) {
                      return result.getFilePath();
                  }
                  return null;
              }

          具有三個(gè)參數(shù),前面幾行代碼都是很一些netty的初始化工作,具體看一個(gè)私有方法uploadFile,如下代碼所示:

          private static void uploadFile(ClientBootstrap bootstrap, String host,
                      int port, File file, String fileName, String thumbMark,
                      String userName, String pwd) {
                  //1.構(gòu)建uri對(duì)象
                  URI uri = getUri(host, port);
                  //2.連接netty服務(wù)端
                  ChannelFuture future = bootstrap.connect(new InetSocketAddress(host,
                          port));
                  //3.異步獲取Channel對(duì)象
                  Channel channel = future.awaitUninterruptibly().getChannel();
                  if (!future.isSuccess()) {
                      future.getCause().printStackTrace();
                      bootstrap.releaseExternalResources();
                      return;
                  }
                  //4.初始化文件上傳句柄對(duì)象
                  WrapFileClientHandler handler = new UploadFileClientHandler(host, uri,
                          file, fileName, thumbMark, userName, pwd);
                  //5.獲取Request對(duì)象
                  HttpRequest request = handler.getRequest();
                  //6.獲取Http數(shù)據(jù)處理工廠
                  HttpDataFactory factory = getHttpDataFactory();
                  //7.進(jìn)行數(shù)據(jù)的包裝處理,主要是進(jìn)行上傳文件所需要的參數(shù)的設(shè)置,此時(shí)調(diào)用的句柄是具體的UploadFileClientHandler對(duì)象
                  HttpPostRequestEncoder bodyRequestEncoder = handler
                          .wrapRequestData(factory);
                  //8.把request寫到管道中,傳輸給服務(wù)端
                  channel.write(request);
                  //9.做一些關(guān)閉資源的動(dòng)作
                  if (bodyRequestEncoder.isChunked()) {
                      channel.write(bodyRequestEncoder).awaitUninterruptibly();
                  }
                  bodyRequestEncoder.cleanFiles();
                  channel.getCloseFuture().awaitUninterruptibly();
                  bootstrap.releaseExternalResources();
                  factory.cleanAllHttpDatas();
              }

          主要有以下實(shí)現(xiàn)步驟:

          1. 構(gòu)建uri對(duì)象

          2. 連接netty服務(wù)端

          3. 異步獲取Channel對(duì)象

          4. 初始化文件上傳句柄對(duì)象

          5. 獲取Request對(duì)象

          6. 獲取Http數(shù)據(jù)處理工廠

          7. 進(jìn)行數(shù)據(jù)的包裝處理,主要是進(jìn)行上傳文件所需要的參數(shù)的設(shè)置,此時(shí)調(diào)用的句柄是具體的UploadFileClientHandler對(duì)象

          8. 把request寫到管道中,傳輸給服務(wù)端

          9. 做一些關(guān)閉資源的動(dòng)作
            具體細(xì)節(jié)實(shí)現(xiàn)請(qǐng)參考github上的代碼。如果各位讀者喜歡的話,可以加個(gè)star哈。

          3.netty-file-server

          3.1 概述

          服務(wù)端組件實(shí)現(xiàn)功能也是跟客戶端一致,具有以下功能:文件上傳,文件替換,文件刪除,如果是圖片的話,還可以生成縮略圖等功能。代碼結(jié)構(gòu)如下圖所示:

          org.lyx.file.server包是該組件的核心包。具體的處理句柄類有以下幾個(gè):

          1. 文件上傳:UploadFileServerHandler

          2. 刪除文件:DeleteFileServerHandler

          3. 替換文件:ReplaceFileServerHandler

          4. 生成縮略圖:CreateThumbPictureServerHandler

          以上所以句柄類的接口均為FileServerProcessor,并且繼承了抽象類AbstractFileServerHandler。

          3.2 實(shí)現(xiàn)步驟

          具體實(shí)現(xiàn)步驟還是以文件上傳為例。
          首先org.lyx.file.server.support.FileServerHandler類會(huì)持續(xù)監(jiān)聽客戶端的請(qǐng)求,如果是文件處理動(dòng)作,則會(huì)進(jìn)入messageReceived方法進(jìn)行相應(yīng)的處理邏輯。該類定義了以下成員變量:

          //http請(qǐng)求
              private HttpRequest request;
              //是否需要斷點(diǎn)續(xù)傳作業(yè)
              private boolean readingChunks;
              //接收到的文件內(nèi)容
              private final StringBuffer responseContent = new StringBuffer();
              //解析收到的文件
              private static final HttpDataFactory factory = new DefaultHttpDataFactory(DefaultHttpDataFactory.MINSIZE); //16384L
              //post請(qǐng)求的解碼類,它負(fù)責(zé)把字節(jié)解碼成Http請(qǐng)求。
              private HttpPostRequestDecoder decoder;
              //請(qǐng)求參數(shù)
              private RequestParam requestParams = new RequestParam();

          該方法實(shí)現(xiàn)中,如果文件大小小于chunked的最小值,則直接進(jìn)行文件上傳操作。否則,需要進(jìn)行分塊處理。然后進(jìn)行文件上傳操作。
          文件大小小于1k的操作:

          需要分塊處理操作:


          以上操作主要有兩個(gè)注意點(diǎn):

          1. 請(qǐng)求參數(shù)的解析工作(根據(jù)HttpDataType進(jìn)行相應(yīng)參數(shù)的賦值操作)

          2. 根據(jù)解析的參數(shù)進(jìn)行相應(yīng)的文件處理操作(根據(jù)文件操作類型,選擇相應(yīng)的處理句柄進(jìn)行文件處理)

          瀏覽 26
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  六区,七区视频在线播放 | 亚洲黄色视频在线 | 欧美先锋资源 | 一级特黄制黄片 | 毛片AV网站 |