大容量ファイルのアップロード
一般的に、HTTPプロトコルは2GB以上の要求データを処理していない。ブラウザなどのクライアントは、2GB以上のデータを送信できない場合があり、一般的に、Webサーバーは、2GB以上の要求を受けないからである。
DEXTUpload.NET ProfessionalはDEXTUploadNX(PlugINベース)とDEXTUpload X5(HTML5ベース)のような、自社のコンポーネント製品を一緒に使用して大量の要求データを処理することができる機能を提供する。 (大容量ファイルのアップロードは、そのコンポーネントとの連動をした場合のみ可能であり、単独で対応していない。)
大容量ファイルのアップロードは、一般的なファイルのアップロードとは、処理方式が異なる。一般的に、ブラウザなどのクライアントから送信されるデータには、複数のフォーム要素(文字列)と複数のファイルの要素が一緒に伝送される。(一般的なアップロード)が要求(request)をDEXTUpload.NET Professionalは「FileUpload」クラスを使用して、一度に処理する。しかし、大容量のアップロードは、クライアントで一度の要求にすべての要素(文字列とファイル)が含まず、単一のファイルのみを転送する。簡単に言うと、一般的なファイルのアップロードでは、ファイル10個を送信するために、1回の要求を送信するが、大容量のアップロードでは、10回のリクエストを送信するものである。大容量アップロードの要求を個別に区分建て送る理由は、HTTP上で2GB以上のファイルを処理できないからであり、大容量のファイルを処理するために、クライアントがファイルの数だけ要求を分けて送信する過程を踏むため、ファイルの数だけリクエストが起こるだろう。さらに、個々のファイルのサイズが2GB以上の場合も存在するので、ファイルも部分的に分けて送信する必要がある。
例えばサイズが2.5GBのファイル10個をアップロードすると仮定して、ファイルを転送するとき、約500MB単位で転送をする場合(2.5 / 0.5)* 10 =約50回のリクエストが発生する。
DEXTUpload.NET Professional製品を使用して、大容量のアップロードを処理する場合には、50回のすべての要求を処理する必要があるサーバー側のコードを作成する必要はなく、ファイルの数(10回)だけ要求が来ると仮定し、アップロードされたファイルを処理するくれればされる。DEXTUpload.NET Professional製品は、開発者が作成するコードは、1つのファイル(一時ファイル)がアップロードが完了(割って送信されたファイルの断片がすべて合わさった状態)されたことを保証する。
DEXTUpload.NET Professional製品は、大容量のファイルのアップロードと一般アップロードを区別建てるための設定が別に存在しない。ただファイルのアップロードに必要(一般アップロードも同様)した「FileUploadMonitorModule」クラスのみHTTPモジュールに登録されていればよい。開発者の立場では、アップロードを処理するコードで多数のファイルを処理するのではなく、一度に1つのファイルだけを処理するようにコードを記述するの違いだけである。
大容量ファイルのアップロードの詳細については、DEXTUploadX5製品を持って説明する。(DEXTUploadX5製品の認証プロセスは、DEXTUploadX5マニュアルを参照する。)
- DEXTUploadX5 + ASP.NET
-
function onDX5Created(id) { var dx = dx5.get(id); //ファイルのアップロードを処理するパスを設定する。 dx.setUploadURL("http://../upload.ashx?use=dext"); //大容量ファイルのアップロードの方法を使用するには、EXNJに設定する。 dx.setUploadMode("EXNJ"); //ファイルを分割するブロックサイズをbyte単位で設定する。 dx.setUploadBlockSize(10 * 1024 * 1024); }
DEXTUploadX5は、ファイルを送信する「sender」の役割を果たしている。一方、DEXTUpload.NET Professionalは、サーバー側にファイルを受け取る「receiver」の役割を担う。
DEXTUploadX5はファイルをアップロードする際に「form」要素を使用してマルチパートデータを要求することなく、「setUploadURL」関数を使用して、アップロードを処理する経路(アドレス)を設定する。
アップロードを処理するパスに「use = dext」クエリ文字列がない場合はDEXTUpload.NET Professionalコンポーネントでアップロードを処理せず、ASP.NET、デフォルトのアップロードに処理されるため、大容量のアップロード処理がない。したがって、必ず「use = dext」クエリ文字列を指定するようにする。
DEXTUploadX5を使用したファイルのアップロードは、HTML形式の応答データを要求しないので、ファイルのアップロードを処理するコードは、aspxページよりashx汎用ハンドラを使用することをお勧めします。
サーバー側の処理のコードは次のとおりである。
public class upload : IHttpHandler { public void ProcessRequest(HttpContext context) { Upload(context); } } private void Upload(HttpContext context) { using (var dext = new FileUpload()) { //大容量のファイルは、一度に1つのファイルのみ処理がされる。 //もしファイル50個をアップロードする場合ハンドラの「ProcessRequest」メソッドは、50回呼び出されます。 var element = dext.GetSingleFileElement(); if (!element.IsEmpty) { //アップロードされたファイルを保存します。 element.Save(); ... } else { //ファイルがない場合はIsEmptyプロパティが「true」である。 ... } } }
DEXTUploadX5は、空のファイルを転送していない。(0バイトのファイルではない。)
したがって、「IsEmpty」属性は、常に「false」でなければならない。そうでなければ、DEXTUploadX5を介してサーバー側のコードが呼び出されたことがないことに注意しなければならない。
- DEXTUploadX5 + ASP.NET MVC
-
function onDX5Created(id) { var dx = dx5.get(id); //ファイルのアップロードを処理するパスを設定する。 dx.setUploadURL("http://../Sample/Upload?use=dext"); //大容量ファイルのアップロードの方法を使用するには、EXNJに設定する。 dx.setUploadMode("EXNJ"); //ファイルを分割するブロックサイズをbyte単位で設定する。 dx.setUploadBlockSize(10 * 1024 * 1024); }
ASP.NET MVC環境では、クライアントは、Web Form環境とは異なる別の設定にやらなく内容はない。
DEXTUploadX5を使用したファイルのアップロードは、HTML形式の応答データを要求しないので、ファイルのアップロードを処理するメソッドでは、「Controller.Content」メソッドを使用して「ContentResult」クラスのオブジェクトを返すようにする。
サーバー側の処理のコードは次のとおりである。
[UseDEXT] public ActionResult Upload([Bind(Prefix = "DEXTUploadX5_FileData")] DEXTPostedFile file) { //大容量のファイルは、一度に1つのファイルのみ処理がされる。 //もしファイル50個をアップロードする場合、コントローラのUploadメソッドは、50回呼び出されます。 var element = file.Element; if (!element.IsEmpty) { //アップロードされたファイルを保存します。 element.Save(); ... //応答データをDEXTUploadX5が受けられるように記録する。 return Content("応答データ", "text/plain", System.Text.Encoding.UTF8); } else { ... } }
DEXTUploadX5は、空のファイルを転送していない。(0バイトのファイルではない。)
したがって、「IsEmpty」属性は、常に「false」でなければならない。そうでなければ、DEXTUploadX5を介してサーバー側のコードが呼び出されたことがないことに注意しなければならない。