計画を実施するには、多くのオプションがあります。 Ajaxアップロードと複数ファイルアップロードの 2つのプラグインに焦点を当てます 。
パート1:サーバー側
サーバー上ではすべてが簡単です。
Request.Files
からファイルを受け取ります。 JSONを介してクライアントスクリプトと通信します。 このため、コントローラーの戻り値は
JsonResult
またはその子孫になります。 ただし、コンテンツタイプはtext / htmlのままにします。そうしないと、ブラウザはapplication / jsonのようなコンテンツを保存するように提供します。
シンプルアクション:
- プライベート読み取り専用IFileService _fileService = new FileServiceStub ( ) ;
- /// <summary>
- ///サーバーへのアップロードファイルの処理。
- /// </ summary>
- /// <returns>ファイル名のリストを含むJSON結果</ returns>
- [ HttpPost ]
- public JsonResult UploadFiles ( )
- {
- ICollection < string > collection = _fileService。 アップロード (リクエスト。 ファイル ) ;
- 新しい JsonResultを返す
- {
- ContentType = "text / html" 、
- データ= 新規 {コレクション}
- } ;
- }
パート2: 複数ファイルアップロードプラグイン
このプラグインはjQuery.Formで動作します 。
HTMLフォーム:
- < form id = "upload-files" action = "/ File / UploadFiles" method = "post" enctype = "multipart / form-data" >
- < div >
- ファイルのアップロード:
- < 入力 クラス = "multi-file-upload" タイプ = "ファイル" name = "ファイル" / > < / / div >
- < 入力 タイプ = 「送信」 値 = 「ダウンロード」 > < / / 入力 >
- < / フォーム >
- <!-出力メッセージのダウンロードの場所->
- < div id = "messages" > < / / div >
- < h3 >ダウンロードしたファイルの一覧< / / h3 >
- < ol id = "file-list" > < / / ol >
プラグインのセットアップ:
- //ドキュメントが完全にロードされるとコードを実行します。
- $ (ドキュメント) 。 準備完了 ( 関数 ( ) {
- var form = $ ( '#upload-files' ) ; //フォームをダウンロードします。
- var messages = $ ( '#messages' ) ; //通知領域。
- var list = $ ( '#file-list' ) ; //ダウンロード済みのファイルのリスト。
- // MultiFileをカスタマイズします。
- $ ( '.multi-file-upload' ) 。 MultiFile ( {
- max : 5 、 //一度にダウンロードされるファイルの数。
- STRING : { //改行。 htmlコード(たとえば、写真)を埋め込むことができます。
- remove : 'Remove' 、
- selected : 「選択:$ file」 、
- 拒否されました: '無効な拡張子:$ ext!' 、
- duplicate : 'このファイルは既に選択されています: \ n $ファイル!'
- }
- } ) ;
- // ajaxFormを設定します
- フォーム。 ajaxForm ( {
- iframe : true 、 // iframeを使用して送信します。
- dataType : "json" 、 // jsonを使用して交換します。
- //ファイルを送信する前に実行します。
- beforeSubmit : function ( ) {
- // submitがjavascriptから呼び出された場合、次の行のコメントを解除します。
- // $。fn.MultiFile.disableEmpty();
- //ダウンロードメッセージを表示します。 ここにjQuery.blockUIをねじ込む方が良いのですが、わかりやすくするために残しておきます。
- メッセージ。 html ( '<img src = "/ Content / busy.gif" />ファイルのダウンロード...' ) ;
- } 、
- //成功に関する応答を受け取った後に実行します。
- 成功: 関数 (結果) {
- // submitがjavascriptから呼び出された場合、次の行のコメントを解除します。
- // $。fn.MultiFile.reEnableEmpty();
- //ファイルアップロードフォームをクリアします。
- $ ( '.multi-file-upload' ) 。 MultiFile ( 'reset' ) ;
- //ダウンロードメッセージを消去します。
- メッセージ。 空 ( ) ;
- //アップロードされたファイルの一般的なリストに新しいアップロードされたファイルを追加します。
- if ( result。collection。length > 0 ) {
- $。 each ( result。collection 、 function ( i ) {
- リスト。 append ( '<li>' + this + '</ li>' ) ;
- } ) ;
- }
- } 、
- //エラー時に実行します。
- エラー: 関数 ( xhr 、 textStatus 、 errorThrown ) {
- //ファイルアップロードフォームをクリアします。
- $ ( '.multi-file-upload' ) 。 MultiFile ( 'reset' ) ;
- alert ( 'ファイルのダウンロード中にエラーが発生しました:' + errorThrown ) ;
- }
- } ) ;
- } ) ;
パート3: Ajaxアップロードプラグイン
HTMLフォーム:
- <!-ファイルアップロードフォーム。 任意の場合があります。 ->
- < div id = "file_upload_button" >
- <a href = "#"> </a>新しいファイルを追加します。 < / div >
- < div id = " uploading " style = "display:none" > < img src = "/Content/busy.gif" alt = "Download" align = "left" / >ダウンロード中。 < / div >
- <!-ダウンロードしたファイルのリスト->
- < ol class = "files" > < / / ol >
プラグインのセットアップ:
- $ (ドキュメント) 。 準備完了 ( 関数 ( ) {
- 新しい AjaxUpload ( $ ( '#file_upload_button' ) 、
- {
- //選択後すぐにファイルを送信するかどうか
- autoSubmit : true 、
- //送信先
- アクション: '/ File / UploadFiles' 、
- //ファイルを保存する変数の名前。
- 名前 : 'myfile' 、
- //サーバー応答のタイプ。
- 応答: 'json' 、
- //ファイルをアップロードする前に起動します
- // falseを返してキャンセルすることもできます。
- onSubmit : function ( file 、 extension ) {
- //ファイルを選択するための「ボタン」を非表示にします。
- $ ( '#file_upload_button' ) 。 hide ( ) ;
- //ダウンロードメッセージを表示します。
- $ ( '#uploading' ) 。 show ( ) ;
- // 1つのファイルのみをアップロードする必要がある場合:
- //this.disable();
- } 、
- //サーバーから応答を受信した後に実行されます。
- // fileは、クライアントが指定したファイルの名前です。
- //応答-サーバーの応答。
- onComplete : function ( file 、 response ) {
- $ ( '#file_upload_button' ) 。 show ( ) ;
- $ ( '#uploading' ) 。 hide ( ) ;
- // javascriptオブジェクトを取得します。
- var resultObject = eval ( '(' + response + ')' ) ;
- //アップロードされた新しいファイルを一般リストに追加します。
- if ( resultObject。collection。length > 0 ) {
- $。 each ( resultObject。collection 、 function ( i ) {
- $ ( '.files' ) 。 append ( '<li>' + this + '</ li>' ) ;
- } ) ;
- }
- }
- } ) ;
- } ) ;
結論の代わりに
MultiFileは一度に複数のファイルを送信できますが、標準形式(
<input type="file"...
)でのみ配置され
<input type="file"...
。 サイズ:MultiFile(〜20Kb)+ jQuery.Form(〜22Kb)=〜42Kb。
AjaxUploadはファイルを1つずつ送信しますが、プレゼンテーションを柔軟にカスタマイズできます。フォームに添付されません。 プラグインのサイズ:14Kb、つまり MultiFile + Formよりも3倍少ない。
どちらにも「制限」があります。ファイルは一度に1つずつ選択されます。 一度に複数(10個)のファイルを選択する場合は、フラッシュ技術を検討してください。
この例のソースコードはネットワーク上にあります。 全体をマージできますが、 すぐに確認できます 。