ASP.NETコントロールのFileUploadコントロール

6237 ワード

FileUploadコントロールを使用すると、コンピュータからサーバにファイルを送信する方法をユーザーに提供できます.
FileUploadコントロールを使用して、次の操作を行います.
サーバに格納されている特定の場所のファイルをアップロードできるようにします.
アップロード可能なファイルのサイズを制限します.
アップロードされたファイルを保存する前に、そのプロパティを確認します.
FileUploadコントロールを使用すると、画像、テキストファイル、または他のファイルをアップロードできます.FileUploadコントロールには、サーバにアップロードするファイルの名前を入力できるテキストボックスが表示されます.このコントロールには、ファイルナビゲーションダイアログボックスを表示する「参照」ボタンも表示されます.(表示されるダイアログボックスは、ユーザコンピュータのオペレーティングシステムによって異なります.)セキュリティ上の理由から、FileUploadコントロールにファイル名をプリロードすることはできません.
アップロードされたファイルの処理アップロードするファイルが選択され、ページが発行されると、そのファイルは要求の一部としてアップロードされます.ファイルはサーバメモリに完全にキャッシュされます.ファイルのアップロードが完了すると、ページコードが実行されます.
アップロードされたファイルには、次の方法でアクセスできます.
FileUploadコントロールのFileBytesプロパティに公開されているバイト配列です.
FileContentプロパティで公開されているストリームとして使用します.
PostedFileプロパティのタイプHttpPostedFileのオブジェクトとして使用します.PostedFileオブジェクトには、アップロードしたファイルに関する情報を提供するContentTypeやContentLengthなどの属性が公開されています.
コードの実行時に、ファイルの名前、サイズ、MIMEタイプなどのファイルの特性を確認し、ファイルを保存できます.ファイルはバイト配列またはストリームとして使用できます.また、FileUploadコントロールとHttpPostedFileオブジェクトは、ファイルをディスクに書き込むSaveAsメソッドをサポートします.
アップロードされたファイルの保存場所には、固有の制限はありません.ただし、ファイルを保存するには、ASP.NETプロセスには、指定した場所にファイルを作成する権限が必要です.また、アプリケーションは、相対パスではなく絶対パスを使用してファイルを保存するように構成することもできます.これはセキュリティ対策です.httpRuntime構成要素のrequireRootedSaveAsPathプロパティがtrue(デフォルト)に設定されている場合は、アップロードされたファイルを保存するときに絶対パスを指定する必要があります.
HttpServerUtilityクラスのMapPathメソッドを使用して、アプリケーションルートフォルダを表すチルダ(~)を渡す、アプリケーションルートフォルダベースの絶対パスを作成できます.
アップロード可能な最大ファイルのサイズは、MaxRequestLength構成設定の値によって異なります.最大許容値より大きいファイルをアップロードしようとすると、アップロードに失敗します.
一部のページ更新でFileUploadコントロールを使用するFileUploadコントロールは、一部のページレンダリング中の非同期再送スキームには適用されず、再送スキームにのみ使用されるように設計されています.UpdatePanelコントロールの内部でFileUploadコントロールを使用する場合は、パネルとしてPostBackTriggerオブジェクトのコントロールを使用してファイルをアップロードする必要があります.UpdatePanelコントロールは、再送を使用してページ全体を更新するのではなく、ページの選択された領域を更新するために使用されます.
 
セキュリティとFileUploadコントロールFileUploadコントロールを使用すると、スクリプトファイルと実行可能ファイルを含む悪意のあるファイルをアップロードできます.ユーザーがアップロードできるファイルを事前に制限できません.ユーザーがアップロードできるファイルのタイプを制限する場合は、ファイルをアップロードした後にファイルの拡張子やファイルのContentTypeプロパティの値などのファイルフィーチャーをチェックする必要があります.
ページをコミットする前に、クライアント・スクリプトを使用して、ユーザーがテキスト・ボックスに入力したファイル名を確認できます.クライアントでファイル名チェックを実行すると便利ですが、実行可能ファイルなどの安全でないファイルタイプをアップロードできないことは保証されません.
FileUpload Webサーバコントロールを使用してファイルをアップロードする
1.FileUploadコントロールをページに追加します.
セキュリティ上の理由から、FileUploadコントロールにファイル名をプリロードすることはできません.
2.このページのLoadイベントのようなイベントのハンドラで、次の操作を行います.
a.FileUploadコントロールのHasFileプロパティをテストして、アップロードされたファイルがあるかどうかを確認します.
b.ファイルのファイル名またはMIMEタイプを確認して、ユーザーが受信するファイルをアップロードしていることを確認します.MIMEタイプを確認するには、FileUploadコントロールのPostedFileプロパティとして公開されているHttpPostedFileオブジェクトを取得します.その後、送信されたファイルのContentTypeプロパティを表示することで、そのファイルのMIMEタイプを取得できます.
場合によっては、アップロードされたファイルのMIMEタイプが偽造されている可能性があるため、ファイルのMIMEタイプのみをチェックするのは信頼できるセキュリティチェックではありません.
c.指定した場所にファイルを保存します.HttpPostedFileオブジェクトのSaveAsメソッドを呼び出すことができます.あるいは、HttpPostedFileオブジェクトのInputStreamプロパティを使用して、アップロードされたファイルをバイト配列またはバイトストリームとして管理することもできます.
次の例では、アップロードされたファイルの使用方法を示します.このコードは、許可されたファイル拡張子のハードコーディングリストに基づいて、アップロードされたファイルのファイル拡張子をチェックし、他のすべてのタイプのファイルを拒否します.その後、ファイルを現在のWebサイトのUploadedImagesフォルダに書き込みます.アップロードされたファイルをクライアントコンピュータ上のファイル名で保存します.HttpPostedFileオブジェクトのFileNameプロパティは、クライアントコンピュータ上のファイルの完全なパスを返すため、FileUploadコントロールのFileNameプロパティが使用されます.
保存したファイルのパスとファイル名をユーザーに表示しないでください.これにより、悪意のあるユーザーに役立つ情報が漏れる可能性があります.
protected void Page_Load(object sender, EventArgs e)
{
    if(IsPostBack)
    {
        Boolean fileOK = false;
        String path = Server.MapPath("~/UploadedImages/");
        if (FileUpload1.HasFile) 
        {
            String fileExtension = 
                System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();
            String[] allowedExtensions = 
                {".gif", ".png", ".jpeg", ".jpg"};
          for (int i = 0; i < allowedExtensions.Length; i++)
          {
               if (fileExtension == allowedExtensions[i])
               {
                    fileOK = true;
               }
          }
        }
 
        if (fileOK)
        {
            try
            {
                FileUpload1.PostedFile.SaveAs(path 
                    + FileUpload1.FileName);
                Label1.Text = "File uploaded!";
            }
            catch (Exception ex)
            {
                Label1.Text = "File could not be uploaded.";
            }
        }
        else
        {
            Label1.Text = "Cannot accept files of this type.";
        }
    }
}