1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

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

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

        1.簡介

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

         

        2.netty-file-client

        2.1 概述

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

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

        1. uploadFile 文件上傳,對應文件處理句柄類為:UploadFileClientHandler

        2. deleteFile 刪除服務端文件,對應文件處理句柄類為:DeleteFileClientHandler

        3. replaceFile 替換服務端文件,對應文件處理句柄類為:ReplaceFileClientHandler

        4. createThumbPicture 生成縮略圖,對應文件處理句柄類為:CreateThumbPictureClientHandler

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

        2.2 實現(xiàn)步驟

        實現(xiàn)步驟以上傳文件為例,其他類似實現(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服務
                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;
            }

        具有三個參數(shù),前面幾行代碼都是很一些netty的初始化工作,具體看一個私有方法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對象
                URI uri = getUri(host, port);
                //2.連接netty服務端
                ChannelFuture future = bootstrap.connect(new InetSocketAddress(host,
                        port));
                //3.異步獲取Channel對象
                Channel channel = future.awaitUninterruptibly().getChannel();
                if (!future.isSuccess()) {
                    future.getCause().printStackTrace();
                    bootstrap.releaseExternalResources();
                    return;
                }
                //4.初始化文件上傳句柄對象
                WrapFileClientHandler handler = new UploadFileClientHandler(host, uri,
                        file, fileName, thumbMark, userName, pwd);
                //5.獲取Request對象
                HttpRequest request = handler.getRequest();
                //6.獲取Http數(shù)據(jù)處理工廠
                HttpDataFactory factory = getHttpDataFactory();
                //7.進行數(shù)據(jù)的包裝處理,主要是進行上傳文件所需要的參數(shù)的設置,此時調(diào)用的句柄是具體的UploadFileClientHandler對象
                HttpPostRequestEncoder bodyRequestEncoder = handler
                        .wrapRequestData(factory);
                //8.把request寫到管道中,傳輸給服務端
                channel.write(request);
                //9.做一些關(guān)閉資源的動作
                if (bodyRequestEncoder.isChunked()) {
                    channel.write(bodyRequestEncoder).awaitUninterruptibly();
                }
                bodyRequestEncoder.cleanFiles();
                channel.getCloseFuture().awaitUninterruptibly();
                bootstrap.releaseExternalResources();
                factory.cleanAllHttpDatas();
            }

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

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

        2. 連接netty服務端

        3. 異步獲取Channel對象

        4. 初始化文件上傳句柄對象

        5. 獲取Request對象

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

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

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

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

        3.netty-file-server

        3.1 概述

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

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

        1. 文件上傳:UploadFileServerHandler

        2. 刪除文件:DeleteFileServerHandler

        3. 替換文件:ReplaceFileServerHandler

        4. 生成縮略圖:CreateThumbPictureServerHandler

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

        3.2 實現(xiàn)步驟

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

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

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

        需要分塊處理操作:


        以上操作主要有兩個注意點:

        1. 請求參數(shù)的解析工作(根據(jù)HttpDataType進行相應參數(shù)的賦值操作)

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

        瀏覽 26
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        編輯 分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        編輯 分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            ㊣最新国产の精品bt伙计 | 成人黄色视频网站 | 免费无码婬片A片AAA毛扒开 | 精品人妻无码一区二区三区91 | 我x你xx网在线看 | 国产刺激出水片 | 亚洲AV秘 无码一区二区三竹菊 | 丰满少妇被猛烈进入 | 国产精品无码成人久久久 | 四川女人高潮一级毛片 |