C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 126 を表示中)
■74871 / )  Re[3]: WebDAVサーバーファイルアップロードのエラー
□投稿者/ DSC渡邊 (7回)-(2015/02/04(Wed) 18:07:06)
DSC渡邊 さんの Web サイト
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

どうもお手数をおかけしてすいませんでした。

ありがとうございました。




解決済み
返信 編集キー/


管理者用

- Child Tree -