.NetCore + WebUploader大容量ファイルのアップロードスライスを達成

プロジェクトの要件は、ビデオファイルなど、サイトを通じて大きなファイルをアップロードアップロードするファイルの断片化によるファンブルを達成するために、その後、背景をマージします。

オープンソースのフロントデスクでは、プラグインWebUploaderをアップロード使用しています(http://fex.baidu.com/webuploader/)

BaiduのWebFE(FEX)チームによるWebUploaderは、現代のファイルアップロードコンポーネントによって補完、HTML5ベースの、FLASHへの単純な開発しました。IE6 +、iOSの6+、アンドロイド4+との互換性、オリジナルのFLASH操作に従って、主流のIEブラウザを放棄しない一方で、HTML5の利点を十分に発揮することができ、現代のブラウザで。ユーザが任意に選択するために二つの実行時には、同じように呼び出します。

同時ファイルアップロードの大きなスライスを使用して、ファイルのアップロードが大幅に効率を向上させることができます。

 

直接コードで、フロントデスクのCSHTML

@ { 
    レイアウト= NULL; 
} 
<!DOCTYPE HTML> 
<HTML> 
<HEAD> 
    <メタ名= "ビューポート"コンテンツ= "幅=装置幅" /> 
    <リンクのhref = "〜/ JS / webuploader / webuploader.css"のrelは= "スタイルシート" /> 
    <リンクのhref = "〜/のJS / bootstrap.min.css"のrel = "スタイルシート" /> 
    <スクリプトSRC = "〜/ JS / jquery.min.js"> </ SCRIPT> 
    <スクリプトSRC = "〜 /js/webuploader/webuploader.js "> </ SCRIPT> 
    <タイトル>アップロード</ TITLE> 
    <スクリプト> 
        jQueryの(機能(){ 
            VAR $ = jQueryの、
                $一覧= $( '#のthelist')、 
                dataState、
                FM = []、
                FNUM、
                トークン、
                アップローダ; 
            VAR FileExt = [ "MPG"、 "MPEG"、 "MP4"、 "AVI"]; 
            トークン= 'ViewBag.Token @'; 
            IF(トークン== '' ||トークン== '未定義')
            { 
                $( "#アップローダ")非表示();. 
                アラート( "ログインタイムアウト、再度ログインしてください。"); 
            } 
            3つの//モニタブロックアップロードプロセス時点
            WebUploader.Uploader.register({ 
                "送信-前に、ファイル": "beforeSendFile"、
                "前-送信」: "beforeSend"、
                "後は、ファイル送信": "afterSendFile"、
            }、{ 
                    beforeSendFile:機能(ファイル){
                        のvarのstartTime =新しい日付(file.lastModifiedDateを)。
                        fileNameに= file.name。
                        = WebUploader.Deferred(遅延VAR)。
                        (新しいWebUploader.Uploader())md5File(ファイル、0、10 * 1024 * 1024)。
                            .progress(関数(パーセンテージ){ 
                                にconsole.log( "正在读取文件"); 
                            })
                            .then(関数(ヴァル) { 
                                fileMd5 =ヴァル; 
                                fm.push(fileMd5); 
                                deferred.resolve()。 
                            }); 
                        deferred.promise返します(); 
                    }、 
                    // 2つの時点:見た場合、アップロード・ブロックを、各ブロックの呼び出しにこの機能をアップロードする前に
                    beforeSend:機能(ブロック){ 
                        VAR用のDeferred)は(WebUploader.Deferred =。
 
                        AJAXは、試験前//このブロックは、アップロードされているかどうかを確認するためにファイルをアップロード
 
                        this.owner.options.formData.fileMd5 = fileMd5; 
                        this.owner.options.formData.chunk = block.chunk; 
                        deferred.resolve(); 
                        戻りdeferred.promiseを( ); 
                    } 
                    // 3つの時点:正常にアップロードこの関数呼び出しの後にすべての部分
                    afterSendFileを:機能(ファイル){
                        VAR延期= $ .Deferred();  
                                FNUM ++; 
                        $( '#' + file.id).find( 'p.state')テキスト( '最後のステップ');. 
                        はconsole.log(ファイルを);
                        console.log(file.guid)。
                        $アヤックス({ 
                            タイプ: "POST"、
                            URL: "/ API / V1 /チェック/ FileMerge"、
                            データ:{ 
                                GUID:file.guid、
                                fileMd5:FM [FNUM]、
                                ファイル名:file.name 
                            }、
                            キャッシュ:偽、
                            非同期:偽、
                            成功:関数(応答){ 
                                IF(response.success == TRUE){
                                console.log(応答)。
                                    dataState =応答; 
                                    フラグ= TRUE。
                                }他{ 
                                    フラグ= FALSE。
                                } 
                                deferred.resolve()。
                            }、
                            エラー:関数(){ 
                                FNUM ++。
                                dataState =未定義。
                                フラグ= falseは、
                                deferred.reject(); 
                            }
                        }); 
 
                        deferred.promise返します(); 
                    }
                }); 
            アップローダー= WebUploader.create({ 
                サイズを変更:偽、
                fileNumLimit:10、
                swfファイル: '/js/Uploader.swf'、
                サーバー: '/ API / V1 / /のFileSaveをチェック] 
                選択: '#picker'を、
                チャンク:真、
                CHUNKSIZE:* 1024 * 1024 10、
                chunkRetry:5 
                //、FORMDATA:{ 
                // GUID:GUID 
                //} 
            })。
            uploader.on( 'beforeFileQueued'、関数(ファイル){ 
                VAR isAdd = FALSE;
                {(; iはFileExt.lengthを<I ++がVAR I = 0)ため 
            uploader.on( 'fileQueued'、関数(ファイル){ 
                    ){[I](file.extに含ま== FileExt場合
                        file.guid = WebUploader.Base.guid()。
                        isAdd =はtrue。
                        ブレーク; 
                    } 
                } 
                戻りisAdd。
            }); 
            uploader.on( 'uploadBeforeSend'、関数(オブジェクト、データ、ヘッダ){ 
                //console.log(object); 
                headers.Authorization =トークン; 
                data.guid = object.file.guid; 
            }); 
            //当有文件添加进来的时候
                の$ list.append( '<div要素のid = "' + file.id + '"クラス= "アイテム">' + 
                    '<H4クラス= "情報">' + file.name + '</ H4>' 
                    '<INPUTタイプ= "隠された" ID =「H_' file.id + +「 "値=" '+ file.guid +' "/> '+ 
                    ' <Pクラスは、="国家「>アップロードを待っている... </ P> '+ 
                    ' </ div>「); 
            }); 
 
            //ファイルアップロードプロセスを作成します。プログレスバーがリアルタイムで表示されます。
            uploader.on( 'uploadprogressの'機能(ファイルパーセンテージ){ 
                VAR $ Liが$( '#' + file.id)、= 
                    $ $ li.findパーセント=() 'プログレスプログレスバーを。。'; 
                //作成された重複を避ける
                (!$パーセント場合を。
                        '<DIV CLASS = "プログレス"ロール= "プログレスバー"スタイル= "幅:0%">' + 
                        '</ div>の' + 
                        '</ div>')appendTo($李).find(」。 。プログレスバー'); 
                } 
 
                $ percent.css( '幅'、百分率* 100 + '%'); 
            }); 
 
            uploader.on( 'uploadSuccess'、機能(ファイル){ 
                場合(dataState ==未定義){ 
                    $( '#' + file.id).find( 'p.state')テキスト( '上传失败'); 
                    $ ( '#' + file.id).find( 'ボタン')(削除); 
                    $( '#' + file.id).find( 'p.state' 
                    フラグ= FALSE; 
                    file.setStatus( 'エラー'); 
                } 
                もし(dataState.success == TRUE){ 
                    $( '#' 。+ file.id).find( 'p.state')テキスト( '已上传'); 
                    $( '#' + file.id).find( 'ボタン')(削除)。
 
                    $( '#' + file.id).find( 'p.state')テキスト( '上传失败')。
                    フラグ= falseは、
                } 
            })。
 
            uploader.on( 'uploadError'、関数(ファイル){ 
                $( '#' + file.id).find( 'p.state')のテキスト( '上传出错'); 
            }); 
  
            ( 'uploadComplete' uploader.on、関数(ファイル){
                。$( '#' + file.id).find(」。進歩)フェードアウト(); 
            }); 
 
            uploader.on( 'すべて'、関数(タイプ){ 
                (タイプ=== 'startUpload'){もし
                    状態= 'アップロード'; 
                }もしそうでなければ(タイプ=== 'stopUploadは'){ 
                    状態= '一時停止'。
                } 
            })。
            $ btn.on({)(、機能を'クリック'
                IF(状態=== 'アップロード'){ 
                    uploader.stop()。
                }そうであれば(状態== '行わ'){ 
                    window.location.reload()。
                } 
                他{ 
                    uploader.upload()。
                } 
            })。
        }); 
    </スクリプト> 
</ HEAD> 
<BODY> 
    の<divのid = "アップローダー"クラス= "WU-例"> 
        <スパンのスタイル= "色:赤">只能上传MPG、MPEG、MP4、AVIファイル格式的视频文件</ span>の
        <divのID = "thelist"クラス= "アップローダーリスト"> </ div> 
        <divのクラス= "btns"> 
            <divのID = "ピッカー"クラス= "webuploaderコンテナ"> <DIV CLASS = "webuploaderピック">选择文件</ div> <divのスタイル= "位置:絶対;トップ:0PX;左:0PX;幅:88px;高さ:34px;オーバーフロー:隠された;底:自動;右:自動;">の<input type = "ファイル"名前= "ファイル"クラス= "webuploader-要素-目に見えない"複数= "複数"> <ラベルスタイル= "不透明度:0;幅:100%; 
            背景:RGB(255、255、255); "> </ label>は</ div> </ div> <ボタンのid =" ctlBtn」クラス= "BTN BTN-デフォルト">开始上传</ボタン>
        </ DIV> 
    </ DIV> 
</ BODY> 
</ HTML>

背景コード:

#regionは、動画のアップロード
        、公開IActionResultアップロードを()
        { 
            ; //は提供が、フロントデスクに送信されたときに、アヤックス= HttpContext.Request.Headers要求ViewBag.Token [「認可」]認証情報を取得する
            (ビューを返す); 
        } 
        /// <要約> 
        ///アップロード
        /// </要約> 
        /// <>> </戻り値を返します
        [HttpPost] 
        非同期タスク<IActionResult>のFileSave()公共
        { 
            VAR = DATE要求; 
            VAR = Request.Form.Filesファイル; 
            ロングfiles.Sumサイズ=(F => f.Length); 
            foreachの(ファイル内のvarたFormFile)
            { 
                IF(formFile.Length>0)
                { 
                    文字列FileExt = formFile.FileName.Substring(formFile.FileName.IndexOf() ''); //ファイル拡張子、無料の"" 
                    長いファイルサイズ= formFile.Length; //バイト単位でファイルサイズを取得します単位
                    //ストリングnewFileName = "" Guid.NewGuid()のToString()+ + fileExt; // ランダムに生成する新しいファイル名
                    文字列DIRPATH = Path.Combine(_uploadConfig.TmpPath、のRequest.Form [ "GUID"]) ; 
                    IF(Directory.Exists(DIRPATH)!)
                    { 
                        Directory.CreateDirectory(DIRPATH); 
                    } 
                    VARファイルパス= DIRPATH + "/" +のRequest.Form [ "チャンク"] + FileExt。
                    使用して(VARストリーム=新しいFileStreamを(filePathに、FileMode.Create))
                    { 
                        formFile.CopyToAsync(ストリーム)を待ちます。
 
                    } 
                } 
            } 
            OK(新しい{カウント= files.Count、サイズ})を返します。
        } 
 
        /// <要約> 
        ///合并请求
        /// </要約> 
        /// <戻る> </戻り> 
        [HttpPost] 
        タスク非同期パブリック<IActionResult> FileMerge()
        { 
            BOOL OK = FALSE; 
            文字列ERRMSG = ""; 
            試す
            { 
                VAR一時的= Path.Combine(_uploadConfig.TmpPath、のRequest.Form [ "GUID"]); //临时文件夹
                文字列filename =のRequest.Form [ "FILENAME" ]; // 名の
                文字列fileExt = Path.GetExtension(fileNameに); // ファイル拡張子を取得
                するvarファイル=のDirectory.GetFiles(一時的に); //は、 次の書類をすべて取得
              
                するvar finalFilePathを= Path.Combine(_uploadConfig.UpLoadPath + fileNameに); // エンドファイル名
                // VAR新しい新しいFS = FileStreamを(finalFilePath、FileMode.Create); 
                使用(VAR新しい新規FS = FileStreamを(finalFilePath、FileMode.Create))
                { 
                    foreachの(一部のvar files.OrderBy(X => x.length).ThenBy(X => X))
                    { 
                        = NULLバイト。 
                        VARバイト= System.IO.File.ReadAllBytes(パート)
                        fs.WriteAsync(バイト0、bytes.Length)待ちます。
                        System.IO.File.Delete(一部); //删除分块
                    } 
                    Directory.Delete(一時的な); //删除文件夹
                    =真OK。
                } 
            } 
            キャッチ(例外例)
            { 
                OK = FALSE; 
                ERRMSG = ex.Message; 
                log4net.Error(ERRMSG)。
            } 
            (OK)であれば
            { 
                (新しい{成功= TRUE、MSG = "")[OK]を返します;} 
            } 
            {
                戻りOK(新しい{成功=偽、MSG = ERRMSG})。; 
            }  
        }
 
        #endregion

 

おすすめ

転載: www.cnblogs.com/wdw984/p/11725118.html