この資料では、Visual Basic .NET を使用してファイルを Web サーバーにアップロードする方法を手順を追って説明します。この資料の手順では、ASP.NET ファイル (WebForm1.aspx) および関連するコード ビハインド ファイル (WebForm1.aspx.vb) を作成し、ファイルを Data という名前のディレクトリにアップロードします。
先頭へ戻る
ASP.NET アプリケーションを作成する
Microsoft Visual Studio .NET で、以下の手順に従って、ファイルを Web サーバーにアップロードする新しいアプリケーションを作成します。
| 1. |
Microsoft Visual Studio .NET を起動します。
|
| 2. |
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
|
| 3. |
[新しいプロジェクト] ダイアログ ボックスで、[プロジェクトの種類] の [Visual Basic プロジェクト] をクリックし、[テンプレート] の [ASP.NET Web アプリケーション] をクリックします。
|
| 4. |
[場所] ボックスに、プロジェクトを作成する URL を入力します。この例では、http://localhost/VBNetUpload と入力し、[OK] をクリックします。これにより、プロジェクト名 VBNetUpload でプロジェクトが作成されます。Visual Studio .NET の [デザイナ] ビューに WebForm1.aspx ファイルが読み込まれます。
|
先頭へ戻る
Data ディレクトリを作成する
アプリケーションの作成後、ファイルのアップロード先となる Data ディレクトリを作成します。このディレクトリの作成後、書き込みのアクセス許可を ASPNET アカウントに設定する必要があります。
| 1. |
Visual Studio .NET の [ソリューション エクスプローラ] ウィンドウで、[VBNetUpload] を右クリックし、[追加] をポイントし、[新しいフォルダ] をクリックします。デフォルトで、NewFolder1 という名前で新しいフォルダが作成されます。
|
| 2. |
フォルダ名を Data に変更するには、[NewFolder1] を右クリックし、[名前の変更] をクリックし、Data と入力します。
|
| 3. |
エクスプローラを起動し、手順 2. で作成した Data ファイル システム フォルダに移動します。デフォルトでは、このフォルダは以下のフォルダ内にあります。
C:\Inetpub\wwwroot\VBNetUpload\Data
|
| 4. |
セキュリティ設定を変更して Data ディレクトリへの書き込みのアクセス許可を設定するには、[Data] を右クリックし、[プロパティ] をクリックします。
|
| 5. |
[Data のプロパティ] ダイアログ ボックスで、[セキュリティ] タブをクリックし、[追加] をクリックします。
|
| 6. |
[ユーザーまたはグループの選択] ダイアログ ボックスで、ASPNET アカウントをクリックし、[追加] をクリックします。[OK] をクリックして、[ユーザーまたはグループの選択] ダイアログ ボックスを閉じます。
|
| 7. |
aspnet_wp アカウント (computername\ASPNET) をクリックし、以下のアクセス許可の [許可] チェック ボックスをオンにします。Microsoft インターネット インフォメーション サービス (IIS) 6.0 を使用している場合は Network Service アカウントをクリックし、以下のアクセス許可の [許可] チェック ボックスをオンにします。
| ? |
読み取りと実行
| | ? |
フォルダの内容の一覧表示
| | ? |
読み取り
| | ? |
書き込み
|
その他のすべての [許可] および [拒否] チェック ボックスはオフにします。
|
| 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.vb コード ビハインド ファイルにアップロード コードを追加する
データをアップロードできるように WebForm1.aspx.vb コード ビハインド ファイルを変更するには、次の手順を実行します。
| 1. |
[表示] メニューの [デザイン] をクリックします。
|
| 2. |
[Upload] をダブルクリックします。Visual Studio により WebForm1.aspx.vb コード ビハインド ファイルが開き、次のメソッド コードが自動的に生成されます。
Private Sub Submit1_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Submit1.ServerClick
End Sub
|
| 3. |
WebForm1.vb ファイルのクラス レベルに以下のコードが存在することを確認します。
Protected WithEvents Submit1 As System.Web.UI.HtmlControls.HtmlInputButton
Protected WithEvents File1 As System.Web.UI.HtmlControls.HtmlInputFile
ファイルにこのコードが存在しない場合は、ファイルの次の行の後に上記のコードを追加します。
Inherits System.Web.UI.Page
|
| 4. |
次のコードを探します。
Private Sub Submit1_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Submit1.ServerClick
|
| 5. |
Enter キーを押して空白行を追加し、以下のコードを追加します。
If Not File1.PostedFile Is Nothing And File1.PostedFile.ContentLength > 0 Then
Dim fn As String = System.IO.Path.GetFileName(File1.PostedFile.FileName)
Dim SaveLocation as String = Server.MapPath("Data") & "\" & fn
Try
File1.PostedFile.SaveAs(SaveLocation)
Response.Write("The file has been uploaded.")
Catch Exc As Exception
Response.Write("Error: " & Exc.Message)
End Try
Else
Response.Write("Please select a file to upload.")
End If
このコードでは、まず、ファイルがアップロードされたことを確認します。ファイルが選択されていない場合、"Please select a file to upload" というメッセージが表示されます。有効なファイルがアップロードされると、System.IO 名前空間を使用してそのファイル名が抽出され、そのアップロード先が SaveAs パスに組み立てられます。最終的なアップロード先の確定後、そのファイルは File1.PostedFile.SaveAs メソッドを使用して保存されます。例外はすべてトラップされ、例外メッセージが画面に表示されます。
|
| 6. |
Submit1 サブルーチンが次のようになっていることを確認します。
Private Sub Submit1_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Submit1.ServerClick
If Not File1.PostedFile Is Nothing And File1.PostedFile.ContentLength > 0 Then
Dim fn As String = System.IO.Path.GetFileName(File1.PostedFile.FileName)
Dim SaveLocation as String = Server.MapPath("Data") & "\" & fn
Try
File1.PostedFile.SaveAs(SaveLocation)
Response.Write("The file has been uploaded.")
Catch Exc As Exception
Response.Write("Error: " & Exc.Message)
End Try
Else
Response.Write("Please select a file to upload.")
End If
End Sub
|
先頭へ戻る
アプリケーションをテストする
この 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="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="VBNetUpload.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.0">
<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
<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" enctype="multipart/form-data" method="post" 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.vb
Public Class WebForm1
Inherits System.Web.UI.Page
Protected WithEvents File1 As System.Web.UI.HtmlControls.HtmlInputFile
Protected WithEvents Submit1 As System.Web.UI.HtmlControls.HtmlInputButton
#Region " Web Form Designer Generated Code "
'This call is required by the Web Form Designer.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: This method call is required by the Web Form Designer
'Do not modify it using the code editor.
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
End Sub
Private Sub Submit1_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Submit1.ServerClick
If Not File1.PostedFile Is Nothing And File1.PostedFile.ContentLength > 0 Then
Dim fn As String = System.IO.Path.GetFileName(File1.PostedFile.FileName)
Dim SaveLocation as String = Server.MapPath("Data") & "\" & fn
Try
File1.PostedFile.SaveAs(SaveLocation)
Response.Write("The file has been uploaded.")
Catch Exc As Exception
Response.Write("Error: " & Exc.Message)
End Try
Else
Response.Write("Please select a file to upload.")
End If
End Sub
End Class
先頭へ戻る
理論的には、アップロードできる最大のファイル サイズはかなり大きいものです。しかし、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 のワーカー プロセスがリサイクルされる場合があります。
先頭へ戻る
詳細については、次の MSDN (Microsoft Developer Network) Web サイトを参照してください。
先頭へ戻る
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID
323245 (http://support.microsoft.com/kb/323245/EN-US/) (最終更新日 2004-11-03) を基に作成したものです。
この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。
先頭へ戻る