[HOWTO] Visual C# .NET を使用して ASP.NET の Web サーバーにファイルをアップロードする方法

文書翻訳 文書翻訳
文書番号: 323246 - 対象製品
すべて展開する | すべて折りたたむ

目次

概要

この資料では、Visual C# .NET を使用してファイルを Web サーバーにアップロードする方法を手順を追って説明します。この資料の手順では、ASP.NET ファイル (WebForm1.aspx) および関連するコード ビハインド ファイル (WebForm1.aspx.cs) を作成し、ファイルを Data という名前のディレクトリにアップロードします。


ASP.NET アプリケーションを作成する

Microsoft Visual Studio .NET で、以下の手順を実行して、ファイルを Web サーバーにアップロードする新しいアプリケーションを作成します。
  1. Microsoft Visual Studio .NET を起動します。
  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
  3. [新しいプロジェクト] ダイアログ ボックスで [プロジェクトの種類] の下の [Visual C# プロジェクト] をクリックし、[テンプレート] の下の [ASP.NET Web アプリケーション] をクリックします。
  4. [場所] ボックスに、URL を入力してプロジェクトを作成します。この例では、http://localhost/CSharpUpload と入力し、[OK] をクリックします。これにより、CSharpUpload というデフォルトの名前でプロジェクトが作成されます。Visual Studio .NET の [デザイナ] ビューに WebForm1.aspx ファイルが読み込まれます。

Data ディレクトリを作成する

アプリケーションを作成後、ファイルのアップロード先となる Data ディレクトリを作成します。このディレクトリを作成後、書き込みのアクセス許可を ASPNET アカウントに設定する必要があります。
  1. Visual Studio .NET の [ソリューション エクスプローラ] ウィンドウで、[CSharpUpload] を右クリックし、[追加] をポイントし、[新しいフォルダ] をクリックします。デフォルトで、NewFolder1 という名前で新しいフォルダが作成されます。
  2. フォルダ名を Data に変更するには、[NewFolder1] を右クリックし、[名前の変更] をクリックし、Data と入力します。
  3. エクスプローラを起動し、手順 2. で作成した Data ファイル システム フォルダに移動します。デフォルトでは、このフォルダは以下のフォルダにあります。
    C:\Inetpub\wwwroot\CSharpUpload\Data
  4. セキュリティ設定を変更して Data ディレクトリへの書き込みのアクセス許可を設定するには、[Data] を右クリックし、[プロパティ] をクリックします。
  5. [Data のプロパティ] ダイアログ ボックスで、[セキュリティ] タブをクリックし、[追加] をクリックします。
  6. [ユーザーまたはグループの選択] ダイアログ ボックスで、ASPNET アカウントをクリックし、[追加] をクリックします。[OK] をクリックして、[ユーザーまたはグループの選択] ダイアログ ボックスを閉じます。
  7. aspnet_wp アカウント (computername\ASPNET) をクリックし、以下のアクセス許可の [許可] チェック ボックスをオンにします。

    • 読み取りと実行
    • フォルダの内容の一覧表示
    • 読み取り
    • 書き込み

    その他のすべての [許可] および [拒否] チェック ボックスはオフにします。
  8. [OK] をクリックして、[Data のプロパティ] ダイアログ ボックスを閉じます。これで、ユーザーがファイルをアップロードできるように、Data ディレクトリのアクセス許可が正しく変更されました。

WebForm1.aspx ページを変更する

ユーザーがファイルをアップロードできるように、WebForm1.aspx ファイルの HTML コードを変更するには、次の手順を実行します。
  1. 開かれている Visual Studio .NET のインスタンスに戻ります。[デザイナ] ウィンドウに WebForm1.aspx が表示されていることを確認します。
  2. WebForm1.aspx ページの HTML ソースを表示するには、[デザイナ] ウィンドウで [WebForm1.aspx] を右クリックし、[HTML ソースの表示] をクリックします。
  3. <form> タグを含む次の HTML コードを探します。
    <form id="Form1" method="post" runat="server">
    					
  4. 次のように、enctype="multipart/form-data" という名前と値の属性を <form> タグに追加します。
    <form id="Form1" method="post" enctype="multipart/form-data" runat="server">
    					
  5. 開始 <form> タグの後に、次のコードを追加します。
    <INPUT type=file id=File1 name=File1 runat="server" />
    <br>
    <input type="submit" id="Submit1" value="Upload" runat="server" />
    					
  6. HTML の <form> タグが次のようになっていることを確認します。
    <form id="Form1" method="post" enctype="multipart/form-data" runat="server">
    <INPUT type=file id=File1 name=File1 runat="server" />
    <br>
    <input type="submit" id="Submit1" value="Upload" runat="server" />
    </form>
    					

WebForm1.aspx.cs コード ビハインド ファイルにアップロードのコードを追加する

データをアップロードできるように WebForm1.aspx.cs コード ビハインド ファイルを変更するには、次の手順を実行します。
  1. [表示] メニューの [デザイン] をクリックします。
  2. [Upload] をダブルクリックします。Visual Studio により WebForm1.aspx.cs コード ビハインド ファイルが開き、次のメソッド コードが自動的に生成されます。
    private void Submit1_ServerClick(object sender, System.EventArgs e)
    {
    }
  3. WebForm1.cs ファイルのクラス レベルに次のコードが存在することを確認します。
    protected System.Web.UI.HtmlControls.HtmlInputFile File1;
    protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;
    						
    ファイルにこのコードが存在しない場合は、ファイルの次の行の後に上記のコードを追加します。
    public class WebForm1 : System.Web.UI.Page
    {
    					
  4. 次のコードを探します。
    private void Submit1_ServerClick(object sender, System.EventArgs e)
    {
    					
  5. Enter キーを押して空白行を追加してから、以下のコードを追加します。
    if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) )
    {
    	string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
    				string SaveLocation = Server.MapPath("Data") + "\\" +  fn;
    	try
    	{
    		File1.PostedFile.SaveAs(SaveLocation);
    					Response.Write("The file has been uploaded.");
    	}
    	catch ( Exception ex )
    	{
    		Response.Write("Error: " + ex.Message);
    	}
    }
    else
    {
    	Response.Write("Please select a file to upload.");
    }
    						
    このコードでは、まず、ファイルがアップロードされたことが確認されます。ファイルが選択されていない場合、"Please select a file to upload" というメッセージが表示されます。有効なファイルがアップロードされると、System.IO 名前空間を使用してそのファイル名が抽出され、そのアップロード先が SaveAs パスに組み立てられます。最終的なアップロード先の確定後、そのファイルは File1.PostedFile.SaveAs メソッドを使用して保存されます。例外はすべてトラップされ、例外メッセージが画面に表示されます。
  6. Submit1 サブルーチンが次のようになっていることを確認します。
    private void Submit1_ServerClick(object sender, System.EventArgs e)
    {	if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) )
    	{
    		string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
    		string SaveLocation = Server.MapPath("Data") + "\\" +  fn;
    		try
    		{
    			File1.PostedFile.SaveAs(SaveLocation);
    			Response.Write("The file has been uploaded.");
    		}
    		catch ( Exception ex )
    		{
    			Response.Write("Error: " + ex.Message);
    		}
    	}
    	else
    	{
    		Response.Write("Please select a file to upload.");
    	}
    }
    					

アプリケーションをテストする

この Visual Studio .NET ソリューションをビルドし、アプリケーションをテストするには、次の手順を実行します。
  1. [ビルド] メニューの [ソリューションのビルド] をクリックします。
  2. ソリューション エクスプローラで、[WebForm1.aspx] を右クリックし、[ブラウザで表示] をクリックします。
  3. ブラウザで WebForm1.aspx が開かれたら、[参照] をクリックします。
  4. [ファイルの選択] ダイアログ ボックスで、4 MB 未満のファイルを選択して、[開く] をクリックします。
  5. [Upload] をクリックしてファイルをアップロードします。そのファイルが Web サーバーにアップロードされ、"The file has been uploaded" というメッセージが表示されます。
  6. 開かれているエクスプローラのインスタンスに戻り、Data ディレクトリに移動します。
  7. ファイルが Data ディレクトリにアップロードされていることを確認します。

大きなファイルをアップロードする

デフォルトでは、ASP.NET では 4,096 KB (4 MB) 以下のファイルのみを Web サーバーにアップロードすることができます。これよりも大きなファイルをアップロードするには、Web.config ファイルの <httpRuntime> セクションの maxRequestLength パラメータを変更する必要があります。

: Machine.config ファイルで maxRequestLength 属性が設定されていて、maxRequestLength の値を超える要求 (たとえば、ファイルのアップロード) が送信されると、カスタム エラー ページが表示されず、Microsoft Internet Explorer には "サーバーが見つからないか、DNS エラーです。" というエラー メッセージが表示されます。

この ASP.NET アプリケーションだけでなく、コンピュータのすべてのアプリケーションの設定を変更するには、Machine.config ファイルを変更する必要があります。

デフォルトでは、<httpRuntime> 要素には、Machine.config ファイルで以下のパラメータが設定されています。
<httpRuntime 
executionTimeout="90" 
maxRequestLength="4096"
useFullyQualifiedRedirectUrl="false" 
minFreeThreads="8" 
minLocalRequestFreeThreads="4"
appRequestQueueLimit="100"
/>
				
Machine.config ファイルは、\System Root\Microsoft.NET\Framework\Version Number\CONFIG ディレクトリにあります。


完全なコード リスト

WebForm1.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="CSharpUpload.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
  <HEAD>
    <title>WebForm1</title>
    <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
    <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" enctype="multipart/form-data" runat="server">
<INPUT type=file id=File1 name=File1 runat="server" >
<br>
<input type="submit" id="Submit1" value="Upload" runat="server" NAME="Submit1">
</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;
namespace CSharpUpload
{
	/// <summary>
	/// Summary description for WebForm1.
	/// </summary>
	public class WebForm1 : System.Web.UI.Page
	{
		protected System.Web.UI.HtmlControls.HtmlInputFile File1;
		protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;
	
		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.Submit1.ServerClick += new System.EventHandler(this.Submit1_ServerClick);
			this.Load += new System.EventHandler(this.Page_Load);
		}
		#endregion
private void Submit1_ServerClick(object sender, System.EventArgs e)
{
	if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) )
	{
		string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
		string SaveLocation = Server.MapPath("Data") + "\\" +  fn;
		try
		{
			File1.PostedFile.SaveAs(SaveLocation);
			Response.Write("The file has been uploaded.");
		}
		catch ( Exception ex )
		{
			Response.Write("Error: " + ex.Message);
		}
	}
	else
	{
		Response.Write("Please select a file to upload.");
	}
}
	}
}
				

詳細

理論的には、アップロードできる最大のファイル サイズはかなり大きいものです。しかし、ASP.NET のヘルス モニタ処理のため、ASP.NET では大きいサイズのファイルをアップロードできません。ASP.NET のワーカー プロセスには、2 GB の仮想アドレス空間がありますが、ヘルス モニタ処理とメモリの断片化のため、ASP.NET のワーカー プロセスでは 1 GB 強しか使用できません。

アップロード処理の際には、ASP.NET によってファイル全体がメモリに読み込まれてから、ファイルがディスクに保存されます。そのため、Machine.config ファイル内の processModel タグの memoryLimit 属性によって、このプロセスはリサイクルされます。memoryLimit 属性には、それを超えて ASP.NET のワーカー プロセスがメモリを消費すると、自動的にプロセスがリサイクルされる物理メモリ量をパーセントで指定します。リサイクルを行うことで、ASP.NET のクラッシュや応答停止などを引き起こすメモリ リークを防止できます。

また、アップロード可能な最大ファイル サイズに影響を与える要因は他にもあります。これには、使用できるメモリ、ハード ディスクの空き領域、プロセッサの速度、および、現在のネットワーク トラフィックが含まれます。標準的なトラフィックでファイル アップロードが行われている場合、10 〜 20 MB の範囲の最大ファイル サイズを使用することをお勧めします。ファイルのアップロードをまれにしか行わない場合は、最大ファイル サイズを 100 MB に設定することもできます。

: ASP.NET で 100 MB を超えるサイズのファイルをアップロードすることもできますが、マイクロソフトでは、アップロードするファイルの最大サイズについてはこの資料に記載されている内容に従うことをお勧めします。ファイル サイズをより厳密に決定するには、実際の運用環境に近いコンピュータで、負荷テストを実行してください。

ファイルのアップロード処理の際にファイル サイズが制限を超えると、次のエラー メッセージが表示される場合があります。
  • ページを表示できません
  • サーバー アプリケーションは使用できません。
    イベント ログには、次のようなエラー メッセージが出力されます。

    aspnet_wp.exe (PID:PIDNumber) was recycled because memory consumption exceeded the SizeLimit MB (Percentage percent of available RAM).

  • 種類 System.OutOfMemoryException の例外がスローされました。
また、アップロードが非常に低速になる場合もあります。Windows タスク マネージャで Aspnet_wp.exe プロセスを観察すると、メモリ使用量の増分が 1 〜 2 秒ごとに 64 KB ずつ変化していることがわかります。ファイルのサイズによっては、この遅延により responseDeadlock エラーが発生し、ASP.NET のワーカー プロセスがリサイクルされる場合があります。

関連情報

詳細については、以下の Microsoft Developer Network (MSDN) Web サイトを参照してください。
<httpRuntime> 要素
http://www.microsoft.com/japan/msdn/library/ja/cpgenref/html/gngrfhttpruntimesection.asp

INPUT
http://www.microsoft.com/japan/msdn/library/ja/jpisdk/dhtml/references/objects/INPUT.asp

ENCTYPE Attribute
http://msdn2.microsoft.com/en-us/library/ms533745.aspx

HtmlInputFile クラス
http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfSystemWebUIHtmlControlsHtmlInputFileClassTopic.asp

HtmlInputFile.PostedFile プロパティ
http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfSystemWebUIHtmlControlsHtmlInputFileClassPostedFileTopic.asp

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 323246 (最終更新日 2003-10-29) を基に作成したものです。

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。

プロパティ

文書番号: 323246 - 最終更新日: 2007年5月21日 - リビジョン: 5.4
この資料は以下の製品について記述したものです。
  • Microsoft ASP.NET 1.0
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft Visual C# .NET 2003 Standard Edition
キーワード:?
kbhowtomaster KB323246
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com