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

HTTPでアップロードの進行状況をチェックしたい

環境/言語:[XP VB.NET2002]
分類:[.NET]

VB.NETでWebRequestを使用して、IIS6.0のWEBサーバーにファイルを
アップロードするプログラムを作りました。
複数のファイルを連続して、アップロードしますが、
各ファイルのアップロードが完了するよりも前に、
次のファイルの処理へと進んでしまい、最終的に完全にアップロードが終わっていないのに、完了メッセージを出してしまいます。
そして、すぐにアプリケーションを終了させると
アップロードも途中で終わり、サーバーには中途半端なサイズのファイルができてしまいます。
進行状況を知るために、サーバー側のファイルをダウンロードすることなく、
サイズを取得する方法が知りたいです。
または、アップロードが完了するまで次の処理に移らない方法があれば、その方法を知りたいです。
サーバーの設定を変えることができないので、
FTPではなく、HTTPで行う方法、しかも、.NetFrameWork1.0でできる方法が知りたいです。
Win32APIでも大丈夫です。
ヒントになりそうな検索ワードでも英語やその他の外国語のサイトでも、
分かる方、教えてください。
よろしくお願いします。
■No22034に返信(ぽたろさんの記事)
> 進行状況を知るために、サーバー側のファイルをダウンロードすることなく、
> サイズを取得する方法が知りたいです。

Web上のファイルのサイズを求めるには?
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=21613&no=0
ご質問を拝見すると、そもそもアップロードの方法が正しくないように思えます。どのような方法でアップロードしようとしているのか、具体的なコードを示していただけないでしょうか?

ちなみに私のサイトでは、以下のページでアップロードの方法を紹介しています。

http://dobon.net/vb/dotnet/internet/webrequestpost.html#multipart
やじゅ様、管理人様ご回答ありがとうございます。

具体的なコードは以下のような感じです。
Dim MyUri As String
Dim WReq As WebRequest
Dim RequestStream As Stream
Dim SomeBytes() As Byte
Dim sUserId As String
Dim sPasswd As String
Dim WRep As WebResponse = Nothing

Dim sFilePath As String


WReq = WebRequest.Create(MyUri)

WReq.Credentials = _
New NetworkCredential(sUserId, sPasswd)
WRep = WReq.GetResponse()


WReq = WebRequest.Create(MyUri)

WReq.Credentials = _
New NetworkCredential(sUserId, sPasswd)

SomeBytes = ReadFile(sFilePath)

WReq.Method = "PUT"
WReq.ContentType = "application/x-www-form-urlencoded"
WReq.ContentLength = SomeBytes.Length

RequestStream = WReq.GetRequestStream
RequestStream.Write(SomeBytes, 0, SomeBytes.Length)
RequestStream.Close()
WRep.Close()

この処理が、終わったら次のファイルを同じ方法でアップロードします。
最初に大きいファイルを送って、その後、小さなファイルを送り、
プログラムを終了させると、小さいほうはちゃんと送られていて、
大きいほうは中途半端なサイズになっています。
プログラムを終了させずに待っていると、大きいほうも完全に転送されます。

やじゅ様のご指摘の方法で、ファイルのサイズを取得しようとすると、
アップロードが完了していない間はエラーになりますが、
エラーが出ている間、ループさせて待てば、アップロードが完了するまで待つことができるので、この方法で何とかなりそうです。

管理人様のご指摘の方法と、私の方法の違いは、最後にサーバーからの応答を受信しているところだと思い、試してみましたところ、
応答が帰ってくるまでに時間がかかり、アップロードが完了するまで、
応答は帰ってこないような感じでした。
何度か試しましたが、
'サーバーからの応答を受信するためのWebResponseを取得
の部分を付け加えてから、うまくいくようになりました。

ありがとうございました。
一人で一週間くらいなやんでいたので、本当に助かりました。
解決済み!

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