次の方法で共有


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. [ファイル] メニューの [新規作成] をポイントし、 [プロジェクト] をクリックします。

    Note

    Visual Studio で、File メニューの New をポイントし、[Web サイト] をクリック

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

    Note

    Visual Studio で、Language の右側にある Visual C# を選択します。 [Templatesで、Web サイトASP.NET クリックします。

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

    Note

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

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

    Note

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

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

    Note

    Visual Studio で、View メニューの Code をクリックします。

フォーム属性を変更する

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

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

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

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

  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 コントロールは、入力コントロールで指定したファイルをアップロードするために使用されます。

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

WebForm1HTML ウィンドウでボタン コントロール コードの後に、開始タグと終了 <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. この記事の「ボタン コントロールの追加」セクションで作成した Upload ボタンをダブルクリックして、ボタン コントロールのClick イベントのイベント ハンドラーを作成します。

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

    using System.IO;
    
  3. Upload ボタンの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. Debug メニューの Start をクリックして、アプリケーションをビルドして実行します。 テキスト ボックスとコマンド ボタンが表示されます。

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

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

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

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

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

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

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

      Note

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

    5. ASPNET選択するオブジェクト名を入力しOKクリックします

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

    7. [Allowで、Full Control チェック ボックスをオンにし、[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;
        }
    }
    

Note

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

トラブルシューティング

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

関連情報