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

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

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

Re[3]: http上のファイルの存在を確認したい


(過去ログ 102 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■60949 / inTopicNo.1)  http上のファイルの存在を確認したい
  
□投稿者/ Mira (55回)-(2011/07/27(Wed) 10:41:19)

分類:[ASP.NET (VB)] 

タイトルの通り、http上のファイルの存在を確認したいのですが適切なクラスはあるでしょうか?

IO.File.Existsだと見つけられません
System.Uriでは判定できません

環境 FrameWork 2.0です。よろしくお願いします
引用返信 編集キー/
■60951 / inTopicNo.2)  Re[1]: http上のファイルの存在を確認したい
□投稿者/ 魔界の仮面弁士 (2270回)-(2011/07/27(Wed) 11:54:31)
No60949 (Mira さん) に返信
> タイトルの通り、http上のファイルの存在を確認したいのですが適切なクラスはあるでしょうか?

ファイルの存在とは、どのような状態を指していますか?

たとえば、仮に
 http://example.com/download.cgi?id=123
という URL があったとして、このサイトにログオンしてから
上記をリクエストすると、sample.pdf がダウンロードされるとします。

この場合、"download.cgi" の有無を調べたいのでしょうか。
それとも "sample.pdf" の有無を調べたいのでしょうか。


前者だとした場合、URL の記述とファイル名は必ずしも合致しませんので、
ファイルの有無をチェックするには、サーバー側で FTP や WebDAV などが
公開されている必要があるかと思います。
http://blogs.gine.jp/taka/archives/1376
http://dobon.net/vb/dotnet/internet/ftpwebclient.html


後者だとした場合、基本的には実際に正規のリクエストをそのまま投げてみて、
その結果から判断する必要があるかと思います。
というのも、この手の動的コンテンツでは、Cookie あるいはその他の要因によって
応答結果が異なるケースが少なくないためです。

たとえば、「訪問者カウンターの画像」や「一回しかダウンロードできないZIP」
などのように、リクエストするたびに応答内容が変化してしまうコンテンツや、
ダウンロード回数や有効期限が設定されているコンテンツなどがありえるためであり、
その場合には、存在チェックしてから実際にダウンロードするという流れにしてしまうと
ファイルを取りこぼしてしまう可能性が考えられるためです。


動的コンテンツではなく、静的なコンテンツ(Web ページ背景に使われる jpg 画像など)
である場合には、HttpWebRequest などで HTTP の HEAD メソッドあるいは GET メソッドを
送出すれば、判断できる可能性があります。


ただし最終的には、サーバー依存ということになってくるかと思います。

Web サーバーは、ファイルが見つからない場合に 404 Not Found、403 Forbidden などの
リクエストエラー系の応答を返すことが多いのですが、中には、ファイルが存在しない場合にも、
「該当ファイルはありません」という内容を正常系応答 200 OK として返答するように
設定されている事もありえるためです。
引用返信 編集キー/
■60954 / inTopicNo.3)  Re[1]: http上のファイルの存在を確認したい
□投稿者/ 魔界の仮面弁士 (2271回)-(2011/07/27(Wed) 13:17:09)
No60949 (Mira さん) に返信
> 分類:[ASP.NET (VB)]
見落としていました。
WinForm のクライアントアプリケーションでは無く、
Web のサーバーアプリケーションだったのですね。


> タイトルの通り、http上のファイルの存在を確認したいのですが適切なクラスはあるでしょうか?
ここでいうファイルの存在とは、自サーバーのファイルを指しているのでしょうか?

/test/sample.html などの URL から、実際の C:\Inetpub\wwwroot\test\sample.html などの
物理パスに変換したいのであれば、その自サーバー上にて
 s = Server.MapPath("/test/sample.html")
あるいは、
 s = HttpContext.Current.Server.MapPath("/test/sample.html")
などを実行してみてください。


(ASP.NET の場合)
http://msdn.microsoft.com/ja-jp/library/system.web.httpserverutility.mappath.aspx

(ASP の場合)
http://msdn.microsoft.com/ja-jp/library/cc338836.aspx
引用返信 編集キー/
■60955 / inTopicNo.4)  Re[2]: http上のファイルの存在を確認したい
□投稿者/ Mira (56回)-(2011/07/27(Wed) 13:20:01)
魔界の仮面弁士さん回答ありがとうございます

> ファイルの存在とは、どのような状態を指していますか?

Web上に存在している(公開されている)静的なファイルのことです

> 動的コンテンツではなく、静的なコンテンツ(Web ページ背景に使われる jpg 画像など)
> である場合には、HttpWebRequest などで HTTP の HEAD メソッドあるいは GET メソッドを
> 送出すれば、判断できる可能性があります。

書かれていることを私なりに理解してコードにしてみました

Dim aa As Net.WebRequest = Net.WebRequest.Create("存在するファイル")
Dim ab As Net.WebRequest = Net.WebRequest.Create("存在しないファイル")

Dim ba As Net.WebResponse = aa.GetResponse()
Dim bb As Net.WebResponse = ab.GetResponse()

bbでエラーになるのでこれで判断するということで間違いないでしょうか?
解決済み
引用返信 編集キー/
■60958 / inTopicNo.5)  Re[2]: http上のファイルの存在を確認したい
□投稿者/ Mira (57回)-(2011/07/27(Wed) 14:31:20)
2011/07/27(Wed) 14:38:31 編集(投稿者)

>>タイトルの通り、http上のファイルの存在を確認したいのですが適切なクラスはあるでしょうか?
> ここでいうファイルの存在とは、自サーバーのファイルを指しているのでしょうか?

今回は自サーバーではありませんが、そのやり方も大変参考になりました

Try
Dim aa As Net.WebRequest = Net.WebRequest.Create("存在確認したいファイル名")
Dim ba As Net.WebResponse = aa.GetResponse()
'あった場合の処理
Catch ex

End Try

といった感じでやってみたのですが
GetRespnoseで応答がなくなるファイルがあります(エラーもでずにそのまま応答が返ってきません)
160k程度のPDFファイルなのですが・・・

何かやり方がまずいのでしょうか?

追加でわかったことがあったので書きます

上記の処理を繰り返し行っているのですが
2回目の処理から応答がなくなります
何か終了処理等追加しないとだめなようですが
何を追加したらよいのかわかりません・・・Close,Disposeとかないし
引用返信 編集キー/
■60959 / inTopicNo.6)  Re[3]: http上のファイルの存在を確認したい
□投稿者/ Mira (58回)-(2011/07/27(Wed) 14:52:58)
自己レスですが解決しました

Try
Dim WebRequestTemp As Net.HttpWebRequest = Net.HttpWebRequest.Create(UriEN)
Dim WebResponseTemp As Net.HttpWebResponse = WebRequestTemp.GetResponse
〜存在した場合のコード〜
WebResponseTemp.Close()
Catch ex As Exception
〜存在しない場合のコード〜
End Try
解決済み
引用返信 編集キー/
■60960 / inTopicNo.7)  Re[3]: http上のファイルの存在を確認したい
□投稿者/ Hongliang (792回)-(2011/07/27(Wed) 14:55:12)
WebResponse は Close を持ってますよ。

サーバによりますが、ちゃんと 404 File Not Found を返してくるようなサーバなら、Method に HEAD を使った方がいいでしょう。実際のファイル転送が行われないので転送量が削減できます。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -