ファイルのアップロード
DEXTUpload.NET Professionalは、HTTPプロトコルベースのでRFC1867規約にサーバーに送信される「multipart/form-data」を処理するサーバーコンポーネントです。
一般的に、ブラウザでファイルを転送するには、HTMLで「input」の要素の「type」属性を「file」に設定する。
しかし、「post」の形式でsubmitをした場合、基本的に「file」の要素を処理していないため「form」要素の「enctype '属性を「multipart/form-data」に変更する必要がある。
<form action="..." method="post" enctype="multipart/form-data"> ... <input type="text" name="name" value="DEXTUpload.NET Professional"/> ... <input type="file" name="file1"/> ... </form>
このようにサーバーに送信されたデータは、ASP.NETで自動的にファイルと文字列のデータを分離した後、「System.Web.HttpPostedFile」オブジェクトとして、個々のファイルにアクセスすることができる。
「HttpPostedFile「オブジェクトは「System.Web.HttpRequest「クラスの「Files」コレクションのプロパティの項目に提供される。
ASP.NET基本的なファイルアップロード機能ではなく、DEXTUpload.NET Professionalコンポーネントを使用するには、まず、「Web.config」の環境設定情報とHTTPモジュールを登録する必要がある。 (環境設定情報とHTTPモジュールの登録は「Web.configの設定」文書と「<dextupload.net><settings>設定」文書を参照すること。)
DEXTUpload.NET Professionalは、クライアントから送信されたマルチパートデータを「Web.config」に登録した'DEXTUpload.NET.FileUploadMonitorModule'モジュールでファイル部分を分離して一時ストレージに一時ファイルとして保存する。
一時的な場所に保存されたファイルをaspxページまたはashxジェネリックハンドラで最終目的地として保存(コードを直接作成して)される。
DEXTUpload.NET Professional製品を使用すれば、一時ファイルの状態で保存する過程は、すべての世話を処理され、最終的な目的地に移動またはコピーをする部分のみコードで実装すればよい。
コンポーネントは、aspxページまたはashxジェネリックハンドラで一時ファイルを扱ってビジネスロジックを処理するのに便利なように「DEXTUpload.NET.FileUpload」クラスを提供する。
//「DEXTUpload.NET.FileUpload」クラスは、アップロードされたファイルを処理するクラスだ。 using (var dext = new FileUpload()) { //「GetString」メソッドを使用して「name」の名前で渡された文字列の値を得る。 var name = dext.GetString("name"); //「GetFileElement」メソッドを使用してアップロードされたファイルにアクセスすることができる「FileElement」オブジェクトを得る。 var element = dext.GetFileElement("file1"); //空のファイルのエントリがない場合は if (!element.IsEmpty) { //ファイルを最終的な保存場所に保存する。ここで「保存」とは、一時的な記憶にあったファイルを目的地に移動またはコピーする作業をいう。 element.Save(); } }
単にファイルのみを保存する用途であれば、次のような単純な処理も可能である。
using (var dext = new FileUpload()) { dext.SaveAll(); }
- 一時フォルダとデフォルトのフォルダ
-
DEXTUpload.NET Professionalは、アップロードされたファイルの情報をメモリ上に記録するのではなく、一時フォルダに記録する。
実際の記憶がなければならない場所にファイルを記録し(移動またはコピー)することは、「DEXTUpload.NET.IFileManagement」 インターフェースの「Save、SaveAs」メソッドを呼び出すときに、または 「DEXTUpload.NET.FileUpload」クラスの」SaveAll 「メソッドを呼び出すときに処理される。
ファイルを記録するフォルダの情報を変更したい場合は「Web.config」ファイルの「dextupload.net「セクション」settings」要素の「defaultPath」属性の値を変更すればよい。 しかし、環境設定値を変更すると、すべての要求に対しても同様に適用されるため、リクエストごとに異なる処理をするには、環境設定値を変えることではなく、 「DEXTUpload.NET.FileUpload」オブジェクトの「DefaultPath」属性の値を変更する方法を使用する。
using (var dext = new FileUpload { DefaultPath = "~/files/store/sub" }) { ... }
- ファイルの保存場所と名前を変更する
-
デフォルトのパスではなく、別のパスにファイルを保存するには、「SaveAll、Save、SaveAs」メソッドにパスパラメータを指定すればよい。
//デフォルトの保存場所が「〜/ files/ store」でファイル名が「photo.jpg」であるとき、 //「Webアプリケーションのルートパス\ files\ store\ photo.jpg」と記録する。 element.Save(); //「Webアプリケーションのルートパス\ files\ other\ photo.jpg」と記録する。 element.Save("~/files/other"); //「Webアプリケーションのルートパス\ files\ other\ photo_new.jpg」に記録する。 element.SaveAs("~/files/other/photo_new.jpg");
「FileUpload 'クラスの「SaveAll」メソッドも「IFileManagment」インターフェースの「Save」メソッドのように保存するパスを別に指定することができる。
もし記録する場所に同じ名前のファイルが存在する場合、ファイル名の後ろに(数字)が付く。
- クライアントファイルの要素を取得
-
「DEXTUpload.NET.FileUpload」クラスは、クライアントに定義されたファイルのフォーム要素を取得するために、様々なメソッドをサポートする。
<form action="..." method="post" enctype="multipart/form-data"> ... <!-- 個別の名前が与えられた場合 --> <input type="file" name="file1"/> <input type="file" name="file2"/> <input type="file" name="file3"/> ... <!-- 同じ名前が与えられた場合 --> <input type="file" name="files"/> <input type="file" name="files"/> <input type="file" name="files"/> </form>
using (var dext = new FileUpload()) { //最初のファイルの要素を得る。 var firstIndex = dext.GetFileElement(0); //「file1」の名前を持つ対象を得る。 var element1 = dext.GetFileElement("file1"); //「file2」の名前を持つ対象を得る。 var element2 = dext.GetFileElement("file2"); //「file3」の名前を持つ対象を得る。 var element3 = dext.GetFileElement("file3"); //「files」の名前を持つ最初の要素を得る。 var firstOfFiles = dext.GetFileElement("files"); //「files」の名前を持つすべてのターゲット(「files、files、files」)を得る。 var listOfFiles = dext.GetFileElements("files"); //すべてのファイルの要素(「file1、file2、file3、files、files、files」)を得る。 var allFiles = dext.Collection.FileElements; //最初のファイルの要素を得る。 = GetFileElement(0)と同じである。 var firstOfAll = dext.GetFirstFileElement(); //最後のファイルの要素を得る。 var lastOfAll = dext.GetLastFileElement(); //ファイルの要素が一つだけある場合にのみ使用します。 var onlyOne = dext.GetSingleFileElement(); }
「GetFileElement」メソッドは、フォームの名前をパラメータとして持つ場合には、その名前を持つファイルのフォーム項目の中の最初の項目を返します。