Visual C# を使用して Web サイトにファイルをアップロードする

この記事では、Microsoft Visual C# を使用してファイルをアップロードする方法について説明します。

元の製品バージョン: Visual C#、ASP.NET、インターネット インフォメーション サービス
元の KB 番号: 816150

概要

この詳細な記事では、ローカル ハード ディスク ドライブから Web サイトに既存のイメージ ファイルをアップロードする方法について説明します。 Input コントロールは、ローカル コンピューターからイメージをアップロードするために使用されます。 アップロードされているこのファイルは、既にアップロードされている既存のファイルを上書きしないように、サーバーに対して検証されます。 アップロードされたファイルがサーバー上に存在するかどうかが検証されます。 この記事では、 EncType フォームの属性を使用して機能を実現します。

要件

この記事では、次のトピックについて理解していることを前提としています。

  • Web アプリケーション
  • ASP.NET

次の一覧では、必要な推奨ソフトウェアとネットワーク インフラストラクチャの概要を示します。

  • Visual C# .NET または Visual C#
  • インターネット インフォメーション サービス (IIS)

ASP.NET Web フォームを作成する

  1. Visual Studio .NET または Visual Studio を起動します。

  2. [ ファイル] メニューの [ 新規] をポイントし、[ プロジェクト] をクリックします。

    注:

    Visual Studio で、[ファイル] メニューの [新規作成] をポイントし、[Web サイト] をクリックします。

  3. [ プロジェクトの種類] で、[ Visual C# プロジェクト] をクリックします。 [ テンプレート] で、[ ASP.NET Web アプリケーション] をクリックします。

    注:

    Visual Studio で、[言語] の右側にある [Visual C# ] を選択 します。 [ テンプレート] で、[ Web サイト ASP.NET] をクリックします。

  4. [ 場所 ] ボックスに次の場所を入力し、[OK] をクリック します
    http://WebServerName/ApplicationName

    注:

    WebServerName は、Web サーバーの名前のプレースホルダーです。 ApplicationName は、アプリケーションの名前のプレースホルダーです。

    既定では、WebForm1.aspx が作成されます。

    注:

    Visual Studio で、[場所] の右側にある [HTTP] を選択し、「」と入力<http://WebServerName>します。

  5. [ 表示 ] メニューの [ HTML ソース] をクリックします。

    注:

    Visual Studio で、[表示] メニューの [コード] をクリックします。

フォーム属性を変更する

WebForm1HTML ウィンドウで、フォーム タグを次のように置き換えます。

<form id="Form1" method="post" runat="server" EncType="multipart/form-data" action="WebForm1.aspx">

属性は EncType 、ポストされるデータの形式を指定します。 ブラウザーでは、この属性を使用して、サーバーに投稿される情報をエンコードします。 このコードの action 属性は、ページが要求を処理することを指定します。 既定では、フォームのメソッド属性は post に設定され、トランザクションで大量のデータを送信できます。

[入力] コントロールを追加して、サーバーにアップロードするファイルを指定します

  1. WebForm1HTML ウィンドウで、開始タグと終了<form>タグの間に次のコードを追加します。

    <INPUT id="oFile" type="file" runat="server" NAME="oFile">
    

    この入力コントロールは、サーバーにアップロードするファイルを指定します。

  2. コントロールの前にテキスト文字列を追加して、ユーザーにメッセージを表示できます。 WebForm1HTML ウィンドウの Input コントロールの前に、次のテキストを入力します。

    サーバーにアップロードするイメージ ファイルを選択します。

ボタン コントロールを追加する

  1. WebForm1HTML ウィンドウで、入力コントロール コードの後に、開始タグと終了<form>タグの間に次のコードを追加します。

    <asp:button id="btnUpload" type="submit" text="Upload" runat="server"></asp:button>
    
  2. この Button コントロールは、Input コントロールで指定したファイルをアップロードするために使用されます。

出力を表示する 1 つのラベルを含む Panel コントロールを作成する

WebForm1HTML ウィンドウで、Button コントロール コードの後に、開始タグと終了<form>タグの間に次のコードを追加します。

<asp:Panel ID="frmConfirmation" Visible="False" Runat="server">
    <asp:Label id="lblUploadResult" Runat="server"></asp:Label>
</asp:Panel>

このコードは、ファイルのアップロードが成功したかどうかを示すメッセージを表示するために使用されます。 この出力を表示するために、1 つのラベルを含む Panel コントロールが作成されます。

Button Click イベントにファイルをアップロードする

このセクションのコードでは、ローカル ファイル システムからファイルを取得し、ファイルがサーバーに既に存在するかどうかを確認してから、ファイルを Web サイトにアップロードします。 このコードを追加するには、次の手順に従います。

  1. この記事の [ボタンの追加] コントロール セクションで作成された [アップロード] ボタンをダブルクリックして、ボタン コントロールのイベントのイベント ハンドラーをClick作成します。

  2. [コード] ウィンドウの上部に次の コード を追加します。

    using System.IO;
    
  3. [アップロード] ボタンのイベント ハンドラーにClick次のコードを追加します。

    string strFileName;
    string strFilePath;
    string strFolder;
    strFolder = Server.MapPath("./");
    // Retrieve the name of the file that is posted.
    strFileName = oFile.PostedFile.FileName;
    strFileName = Path.GetFileName(strFileName);
    if(oFile.Value != "")
    {
        // Create the folder if it does not exist.
        if(!Directory.Exists(strFolder))
        {
            Directory.CreateDirectory(strFolder);
        }
        // Save the uploaded file to the server.
        strFilePath = strFolder + strFileName;
        if(File.Exists(strFilePath))
        {
            lblUploadResult.Text = strFileName + " already exists on the server!";
        }
        else
        {
            oFile.PostedFile.SaveAs(strFilePath);
            lblUploadResult.Text = strFileName + " has been successfully uploaded.";
        }
    }
    else
    {
        lblUploadResult.Text = "Click 'Browse' to select the file to upload.";
    }
    // Display the result of the upload.
    frmConfirmation.Visible = true;
    
  4. [ファイル] メニューの [すべて保存] をクリックします。

アップロード アクションが機能することを確認する

  1. [ デバッグ ] メニューの [ スタート ] をクリックしてビルドし、アプリケーションを実行します。 テキスト ボックスとコマンド ボタンが表示されます。

  2. テキスト ボックスにイメージ ファイルのパスを入力するか、[ 参照 ] をクリックしてローカル コンピューター上のイメージ ファイルを見つけます。

  3. [ アップロード ] をクリックして、ファイルをサーバーに送信します。 ファイルが一意の場合は、アップロードが成功したことを示すメッセージが表示されます。 ファイルが既にサーバーに存在する場合は、適切なメッセージが表示されます。 このアプリケーションからアップロードしたファイルは、ローカル ハード ディスク上の場所 C:\inetpub\wwwroot\ApplicationName に保存されます。

  4. このアプリケーションを.NET Frameworkで動作させるには、ASPNET ユーザーへのフル コントロール アクセスを許可します。 これを行うには、次の手順を実行します。

    1. Windows エクスプローラーでアプリケーション フォルダーを見つけます。 パスは です C:\inetpub\wwwroot\ApplicationName

    2. ApplicationName フォルダーを右クリックし、[プロパティ] をクリックします。 [ApplicationName プロパティ] ダイアログ ボックスが表示されます。

    3. [セキュリティ] タブをクリックします。

    4. [追加] をクリックします。 [ ユーザーまたはグループの選択 ] ダイアログ ボックスが表示されます。

      注:

      Visual Studio の [ ユーザー、コンピューター、またはグループの選択 ] ダイアログ ボックスが表示されます。

    5. [選択するオブジェクト名を入力します] ボックスに「ASPNET」と入力し、[OK] をクリックします

    6. [ApplicationName プロパティ] ダイアログ ボックスで、[グループ名またはユーザー名] の一覧で ASPNET ユーザーをクリックします。

    7. [許可] で、[フル コントロール チェック] ボックスをクリックして選択し、[OK] をクリックします

完全なコード一覧

  • WebForm1.aspx

    <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false"
       Inherits="Howto.WebForm1" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
       <HEAD>
          <title>WebForm1</title>
          <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
          <meta name="CODE_LANGUAGE" Content="C#">
          <meta name="vs_defaultClientScript" content="JavaScript">
          <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
       </HEAD>
       <body MS_POSITIONING="GridLayout">
          <form id="Form1" method="post" runat="server" EncType="multipart/form-data" action="WebForm1.aspx">
             Image file to upload to the server: <INPUT id="oFile" type="file" runat="server" NAME="oFile">
             <asp:button id="btnUpload" type="submit" text="Upload" runat="server"></asp:button>
             <asp:Panel ID="frmConfirmation" Visible="False" Runat="server">
                <asp:Label id="lblUploadResult" Runat="server"></asp:Label>
             </asp:Panel>
          </form>
       </body>
    </HTML>
    
  • WebForm1.aspx.cs

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.IO;
    namespace **ApplicationName** {
    /// <summary>
    /// Summary description for WebForm1.
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Button btnUpload;
        protected System.Web.UI.WebControls.Label lblUploadResult;
        protected System.Web.UI.WebControls.Panel frmConfirmation;
        protected System.Web.UI.HtmlControls.HtmlInputFile oFile;
    
        private void Page_Load(object sender, System.EventArgs e)
        {
        // Put user code to initialize the page here
        }
        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
        // CODEGEN: This call is required by the ASP.NET Web Form Designer.
            InitializeComponent();
            base.OnInit(e);
        }
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.btnUpload.Click += new System.EventHandler(this.btnUpload_Click);
            this.Load += new System.EventHandler(this.Page_Load);
        }
        #endregion
    
        private void btnUpload_Click(object sender, System.EventArgs e)
        {
            string strFileName;
            string strFilePath;
            string strFolder;
            strFolder = Server.MapPath("./");
            // Get the name of the file that is posted.
            strFileName = oFile.PostedFile.FileName;
            strFileName = Path.GetFileName(strFileName);
            if(oFile.Value != "")
            {
                // Create the directory if it does not exist.
                if(!Directory.Exists(strFolder))
                {
                    Directory.CreateDirectory(strFolder);
                }
                // Save the uploaded file to the server.
                strFilePath = strFolder + strFileName;
                if(File.Exists(strFilePath))
                {
                    lblUploadResult.Text = strFileName + " already exists on the server!";
                }
                else
                {
                    oFile.PostedFile.SaveAs(strFilePath);
                    lblUploadResult.Text = strFileName + " has been successfully uploaded.";
                }
            }
            else
            {
                lblUploadResult.Text = "Click 'Browse' to select the file to upload.";
            }
            // Display the result of the upload.
            frmConfirmation.Visible = true;
        }
    }
    

注:

Visual Studio で生成されるコードは、Visual Studio .NET で生成されたコードとは異なります。

トラブルシューティング

  1. ランタイム をインストール したパスの下にある CONFIG フォルダー内のコンピューターにあるMachine.configファイルを開きます。
  2. <processModel>Machine.config ファイル内のセクションを探し、 属性と 属性をpassword、W3wp.exe または Aspnet_wp.exe 実行するユーザーの名前とパスワードに変更userし、Machine.config ファイルを保存します。
  3. CONFIG フォルダーにある一時 ASP.NET ファイル フォルダーを見つけます。 [ 一時 ASP.NET ファイル ] フォルダーを右クリックし、[ プロパティ] をクリックします。
  4. [ 一時 ASP.NET ファイルのプロパティ ] ダイアログ ボックスで、[ セキュリティ ] タブをクリックします。
  5. [詳細設定] をクリックします。
  6. [一時 ASP.NET ファイルのAccess Control設定] ダイアログ ボックスで、[追加] をクリックします。
  7. ダイアログ ボックスの [ 名前 ] ボックスにユーザー名を入力し、[OK] をクリック します
  8. [ 一時 ASP.NET ファイルのアクセス許可エントリ ] ダイアログ ボックスで、ユーザーに完全なアクセス許可を付与し、[ OK] を クリックして [ 一時 ASP.NET ファイルのプロパティ ] ダイアログ ボックスを閉じます。

関連情報