|
■No74771 (れい さん) に返信
返信が遅くなって申し訳ありません。 教えていただいた空ファイルをアップロードした後、目的の大容量ファイルを続けてアップロードするという方法を取ったところ、無事にアップロードに成功しました。
成功したソースコードは以下のとおりです (もっと上手なコードの書き方があるのかもしれませんが・・・) −−−−−−−−−−−−−−−−
Dim fileToUpload As String = "" Dim fileLength As Long = 0 Dim wIdx As Long = 0 Dim url As String = ""
url = サーバーのURL ''空ファイルPUT fileToUpload = 空ファイル(0バイト)のフルパス fileLength = My.Computer.FileSystem.GetFileInfo(fileToUpload).Length url = url.TrimEnd("/"c) & "/" & サーバーのアップロード先フォルダ & IO.Path.GetFileName(fileToUpload) Dim request As HttpWebRequest = DirectCast(System.Net.HttpWebRequest.Create(url), HttpWebRequest) request.Credentials = New NetworkCredential(ユーザー名, パスワード) request.Method = WebRequestMethods.Http.Put request.ContentLength = fileLength request.SendChunked = False request.AllowWriteStreamBuffering = False request.PreAuthenticate = True request.Timeout = 480000 request.Headers.Add("Translate: f")
Dim s As IO.Stream = request.GetRequestStream() Dim fs1 As New IO.FileStream(fileToUpload, IO.FileMode.Open, _ IO.FileAccess.Read) Dim byteTransferRate As Integer = 102400 Dim bytes(byteTransferRate - 1) As Byte Dim bytesRead As Integer = 0 Dim totalBytesRead As Long = 0 bytesRead = fs1.Read(bytes, 0, bytes.Length) s.Write(bytes, 0, bytesRead) s.Close() s.Dispose() s = Nothing fs1.Close() fs1.Dispose() fs1 = Nothing request.GetRequestStream().Close() request.GetResponse().Close()
url = サーバーのURL fileToUpload = アップロードしたい大容量ファイルのフルパス fileLength = My.Computer.FileSystem.GetFileInfo(fileToUpload).Length url = url.TrimEnd("/"c) & "/" & サーバーのアップロード先フォルダ & IO.Path.GetFileName(fileToUpload) request = DirectCast(System.Net.HttpWebRequest.Create(url), HttpWebRequest) request.Credentials = New NetworkCredential(ユーザー名, パスワード) request.Method = WebRequestMethods.Http.Put request.ContentLength = fileLength request.SendChunked = False request.AllowWriteStreamBuffering = False request.PreAuthenticate = True request.Timeout = 480000 request.Headers.Add("Translate: f") s = request.GetRequestStream() Dim fs2 As New IO.FileStream(fileToUpload, IO.FileMode.Open, _ IO.FileAccess.Read) bytesRead = 0 totalBytesRead = 0 Do bytesRead = fs2.Read(bytes, 0, bytes.Length) If bytesRead > 0 Then totalBytesRead += bytesRead s.Write(bytes, 0, bytesRead) End If Loop While bytesRead > 0 s.Close() s.Dispose() s = Nothing fs2.Close() fs2.Dispose() fs2 = Nothing Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse) Dim code As HttpStatusCode = response.StatusCode response.Close() response = Nothing
−−−−−−−−−−−−−−−−
ちなみにアップロードの時間は800MBで2分前後と以前よりも早くなりました。(サーバーが近い場所に移動されたからかもしれませんが…)
結局、何が原因でアップロードエラーが発生したのか、はっきりしませんでした。 サーバー管理者に確認しましたが、ファイルのアクセス権や認証方法も変更していないとのことでした。
大きなデータをアップロードする際の注意点について書かれたURLを見つけて、そこには「AlowWriteStreamBuffering プロパティに Falseを設定して認証機能と共に利用すると 「この要求には、データのバッファが必要です」というエラーが発生する 」と書かれていましたが… 今回のソース修正では、そちらのURLの内容も一部参考にさせていただきました。 参考URL http://fits.hatenablog.com/entry/20070911/1189510041
どうもお手数をおかけしてすいませんでした。
ありがとうございました。
|