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

画像ファイルを落とした時テキストができてしまう

環境/言語:[OS : Windows Vista / 言語 : Visual Basic .NET]
分類:[.NET]

【解決したい問題】

WebClientのdownloadメソッドで画像ファイルhoge.jpgを落としたときに
べつにexceptionも発生せずに 「404 NotFound」などとかかれた
テキストファイル(でもファイル名はhoge.jpgのまま)ができてしまうことがあるんですが
このファイルを作らないようにする方法はありますか.
あるいは即削除すべくそれを判定するにはどうしたらよいでしょうか.
■No27171に返信(JKさんの記事)
> できてしまうことがあるんですが
確認したいので、現象の発生する具体的な URL を教えていただけませんか?

> WebClientのdownloadメソッドで
WebClient.DownloadFile メソッド の事でしょうか?

> べつにexceptionも発生せずに 「404 NotFound」などとかかれた
サーバー側がエラーを返さない場合は、それが正しい動作です。

応答として「HTTP/1.1 404 Not Found」を返すサーバーなら
WebException が発生しますが、サーバー側の応答が、
正常コード「HTTP/1.1 200 OK」を返しているならば、
WebClient はそのまま正常と判断します。

# 具体的な URL が提示されていないので、そのサーバーが実際に
# どのような応答を返しているかは確認できませんけれども。

> あるいは即削除すべくそれを判定するにはどうしたらよいでしょうか.
ダウンロード後にファイルを開いて確認してみては如何でしょう。

(案1) 保存された jpg を Image.FromFile してみて、読み込みに失敗したら
 ダウンロード異常またはファイル破損として判断する。

(案2) SOI マーカーの有無を確認する。具体的には jpeg の先頭 2 バイトが
 &HFFD8 になっているかどうかをみて判断する。
■No27172に返信(魔界の仮面弁士さんの記事)
すばやくて具体的な回答ありがとうございます.ヽ(゚o゚)ノ
WebClient.DownloadFile メソッド です.具体的なファイルは例えば次です.
http://tvde.web.infoseek.co.jp/cgi-bin/jlab-dat/s/000.jpg
なるほど先頭2byteで判定できるのですね.
Imports System
Imports System.IO
Dim fs As New FileStream( "000.jpg", FileMode.Open, FileAccess.Read)
Dim buf(2) As Byte
Dim readSize As Integer = fs.Read(buf, 0, 2)
fs.Close()
If buf(0) = &HFF And buf(1) = &HD8 Then
MessageBox.Show("ok")
Else
System.IO.File.Delete("000.jpg")
End If
でうまくいきました.ありがとうございました.JK
解決済み!
2010/08/15(Sun) 15:06:59 編集(投稿者)

■No27178に返信(JKさんの記事)
> http://tvde.web.infoseek.co.jp/cgi-bin/jlab-dat/s/000.jpg

提示された URL は 404 応答を返す代わりにエラーページにリダイレクトしているようですね。
WebClient クラスではリダイレクトを検出できない(意識させない)のかもしれません。

HttpWebRequest クラスを利用して AllowAutoRedirect プロパティを false にしておけば、HttpWebResponse クラスの StatusCode プロパティで検知できると見込まれます。
(試していません)
こちらを使ったダウンロード手法は下記で紹介されています。
http://dobon.net/vb/dotnet/internet/webrequestsavefile.html
解決済み!

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