- PR -

.NETを使ったCGIプログラムでファイルを受信

1
投稿者投稿内容
未記入
会議室デビュー日: 2005/06/27
投稿数: 13
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)