- - PR -
.NETを使ったCGIプログラムでファイルを受信
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-05-22 20:27
ASP.NET(VB.NET)で開発をしています。
ブラウザから大容量(数百MB)のファイルをWebサーバーにアップロードすることになり(甚だ無茶な要件だとは思いますが)、現在対応策を検討中です。 ASP.NETではアップロードするファイルがメモリに取り込まれてしまう為、サーバーの設定をいくら変えても数百MBのファイルを転送しようとするとOutOfMemoryExceptionでプロセスが落ちてしまいます。 HULFTやMQなどのサードパティー製品をインストールする事が許可されていない為、CGIでファイルを受信することになりました。 しかし、Apatch等のインストールも許可されていない為、IIS6.0上で一切の追加ソフトのインストール無しで、なおかつ他のメンバーでも保守が出来るように、.NETでファイル受信のCGIを作ることになったのですが、作り方がわからず作業が止まってしまっています。 リクエストを投げる側の動作をC#等で実装しているサンプルは見つかったのですが、受信側の情報はみつかりませんでした(殆どがPerl)。 自力であがいてみたのはこんな感じです(CGITEST.htmlとCGITest.cgiは同一ディレクトリに配置)。 【CGITEST.html】 ←ファイルをアップロードする側(ASP.NETではありません) <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <TITLE>test</TITLE> </HEAD> <BODY> <FORM METHOD="POST" enctype="multipart/form-data" ACTION="CGITest.cgi"> <INPUT TYPE="file" name="BUNSHO"><P> <INPUT TYPE="SUBMIT" VALUE="送信"> </FORM> </BODY> </HTML> 【CGITest.cgi その1】 ←コンソールアプリを拡張子を変えて実現 Dim req As HttpWebRequest Dim res As HttpWebResponse Try req = CType(HttpWebRequest.Create("http://hogehoge/CGITEST.html"), HttpWebRequest) res = CType(req.GetResponse, HttpWebResponse) Me.WriteLog("res.ContentLength=" & res.ContentLength.ToString()) Me.WriteLog("res.CharacterSet:" & res.CharacterSet) Finally res.Close() End Try これだとそもそもHttpWebRequestのインスタンスが上手く作れてないようです。 【CGITest.cgi その2】 ←コンソールアプリを拡張子を変えて実現 Dim sb As New System.Text.StringBuilder Dim c As Integer Dim len As Integer = Integer.Parse(System.Environment.GetEnvironmentVariable("CONTENT_LENGTH")) For i As Integer = 0 To len - 1 c = Console.Read sb.Append(Microsoft.VisualBasic.Chr(c)) Next こちらはsb.ToString()で以下の様になります。 ↓ -----------------------------7d72422a8022e Content-Disposition: form-data; name="BUNSHO"; filename="C:\test.txt" ←ファイル名 Content-Type: text/plain test ←ファイルの中の文字列 aaaaaa ←ファイルの中の文字列 -----------------------------7d72422a8022e-- ですがパスやファイルの中に日本語が含まれていたり、バイナリファイルをアップロードするとエラーになります。 行き詰ってしまい手も足も出ない状態です。 何か解決策が分かる方がいましたらご協力をお願いします。 |
1