■74877 / ) |
Re[5]: WebDAVサーバーファイルアップロードのエラー |
□投稿者/ DSC渡邊 (8回)-(2015/02/05(Thu) 09:57:34)
|
■No74873 (れい さん) に返信
懇切丁寧な説明ありがとうございます。助かります。
教えて下さったコードは早速参考にさせていただきました。
ただ、「 request.UnsafeAuthenticatedConnectionSharing = True 」 にすると「転送接続にデータを書き込めません」というエラーが発生しました。
どうやら、サーバーの認証プロトコルはNTLMかKerberos等ではないようです。
最終的には以下のようなソースコードでアップロードに成功しました。
----------------
Dim fileToUpload As String
Dim fileLength As Long
Dim url As Uri
Dim nc As New NetworkCredential(ユーザー名, パスワード)
Dim cc As New CookieContainer 'for tracking session
Dim request As HttpWebRequest
'空ファイルPUT
fileToUpload = アップロード元ファイルのフルパス
Using fs As New IO.FileStream(fileToUpload, IO.FileMode.Open, IO.FileAccess.Read)
fileLength = fs.Length
url = New Uri(サーバーのURL & "/" & サーバーのアップロード先フォルダ & IO.Path.GetFileName(fileToUpload))
request = DirectCast(System.Net.HttpWebRequest.Create(url), HttpWebRequest)
request.Method = WebRequestMethods.Http.Put
request.Headers.Add(HttpRequestHeader.Allow, "PUT") ' for EmptyPUT
request.AllowWriteStreamBuffering = True
request.PreAuthenticate = True
request.Headers.Add("Translate: f") ' for IIS
request.Credentials = nc
request.CookieContainer = cc
request.ContentLength = 0
Using res As HttpWebResponse = request.GetResponse()
url = res.ResponseUri
End Using
request = DirectCast(System.Net.HttpWebRequest.Create(url), HttpWebRequest)
request.Method = WebRequestMethods.Http.Put
request.ContentLength = fileLength
request.SendChunked = False
request.AllowWriteStreamBuffering = False 'no-buffering
request.PreAuthenticate = True ' for sharing auth info
request.AllowAutoRedirect = False
request.Headers.Add("Translate: f")
request.Credentials = nc
request.CookieContainer = cc
request.Timeout = 600000 ''タイムアウト600秒
Using reqst As IO.Stream = request.GetRequestStream()
Dim bytes(102400 - 1) As Byte
Dim bytesRead As Integer = 0
Dim totalBytesRead As Long = 0
Do
bytesRead = fs.Read(bytes, 0, bytes.Length)
If bytesRead > 0 Then
totalBytesRead += bytesRead
reqst.Write(bytes, 0, bytesRead)
End If
Loop While bytesRead > 0
End Using
End Using
Dim code As HttpStatusCode
Using response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
code = response.StatusCode
If code >= 300 AndAlso code < 400 Then Throw New Exception
End Using
----------------
処理効率も良くなったようで、昨日の800MBのファイルで2分程かかったアップロード時間が1分30秒を切るようになりました。
本当にありがとうございました。
|
解決済み
|