DOBON.NET DOBON.NETプログラミング掲示板過去ログ

UploadDataで1GMbyteのファイルを送信する方法

分類:[.NET]

サーバにアップロード時にメモリもCPUにもあまり負荷をかけずに
大容量をファイルをアップロードする方法を探しています。

私が今まで探して一番効率が良いのはWebClientのUploadDataです。
UploadFileもありましたが、この関数でアップロードを行うとなぜか
ファイルのヘッダも記録されてしまいます。
ちなみに、グラフィックファイルはアップロードできませんでした。
しかし、UploadDataは50Mまではうまく動作しますが、これ以上になると
500,501エラーが発生し、Uploadできません。
(ちなみに、サーバはW2K+AS IIS5.0を使っております。)
どなたかご存知の方いらっしゃいますか。

下記のはサンプル

Dim myWebClient As New WebClient
Dim myCache As New CredentialCache
Dim fs As FileStream
Dim fileSize As Int32
Dim filePath As String
Dim url1 as string = "http://10.10.10.10/test/"
Dim fileName As String = "test100M.txt"

myCache.Add(New Uri(url1), "Basic", New NetworkCredential(User1, User1_Pass))
myWebClient.Credentials = myCache
fs = New FileStream("d:\" & fileName, FileMode.Open)
fileSize = fs.Length
Dim b(fileSize) As Byte
fs.Read(b, 0, fileSize)
fs.Close()
Dim responseArray As Byte() = myWebClient.UploadData(url1 & FileName, "PUT", b)
■No2208に返信(シツモンさんの記事)
Upload時にメモリを節約しながら、Uploadできる方法までは突き止めましたが、
なぜか、70Mbyteになると「Dim requestStream As Stream = webreq.GetRequestStream」部分で「'System.Net.WebException' のハンドルされていない例外が system.dll で発生しました。追加情報 : リモート サーバーがエラーを返しました : (500) 内部サーバー エラーです。」メッセージが出て落ちてしまいます。
(60Mbyteまでのファイルだと正常にUploadできます。)

この問題についてご存知の方がいらっしゃいましたら、教えて頂けますでしょうか。

Dim myCache As New CredentialCache
myCache.Add(New Uri("192.168.20.44/TEST/"), "Basic", New NetworkCredential("userid", "userpass"))
'WebRequestの作成
Dim webreq As System.Net.WebRequest = _
System.Net.WebRequest.Create("192.168.20.44/TEST/" & "test70M.txt")
webreq.Credentials = myCache
webreq.Timeout = 40000
webreq.Method = "PUT"
webreq.ContentLength = New FileInfo("d:\test70M.txt").Length

     '問題の部分
Dim requestStream As Stream = webreq.GetRequestStream
'70Mbyte以上のファイルはこの先へ行けない。

Dim sourceStream As New FileStream("d:\test70M.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
Dim buff(4095) As Byte

Dim pos As Integer = 0
pos = sourceStream.Read(buff, 0, buff.Length)
While pos <> 0 'ToDo: Unsupported feature: assignment within expression.
'requestStream.Write(buff, 0, pos)
pos = sourceStream.Read(buff, 0, buff.Length)
End While
MsgBox("終了")
2004/02/27(Fri) 11:40:35 編集(投稿者)

上記の方法は問題ないみたいです。
これはWindows側のメモリコントロールの問題で、
今後SP5で対応パッチが出るらしいです。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板