前提・実現したいこと
対象サイトのファイルをダウンロードするシステムを作成中です。
下記のとおりファイルが壊れてしまい開けなくなります。
問題点分かる方回答よろしくお願いします。
追記 2020/01/27
下記プログラムだとHTMLファイルが保存されているようです。
URLDownloadToFile はpdfなどのファイルをダウンロードできないのでしょうか?
調べた限りでは可能と思われるのですが。
使っているブラウザは【IE11】です。
発生している問題・エラーメッセージ
ダウンロード後のファイルを開くと、ファイルが壊れていると出ます。
該当のソースコード
vba
1Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _ 2(ByVal pCaller As Long, _ 3ByVal szURL As String, _ 4ByVal szFileName As String, _ 5ByVal dwReserved As Long, _ 6ByVal lpfnCB As Long) As Long 7 8 9Sub ieopen() 10 11 Dim ie As InternetExplorer 12 13 Dim doc As Variant 14 15 basedir = "**********" '登録フォルダ入力 16 17 Set ie = New InternetExplorer 18 19 ie.Visible = True 20 21 For i = 1 To 39 Step 1 22 23 url = "*********" 'URL入力 24 25 ie.navigate url 26 27 Application.Wait Now() + TimeValue("00:00:03") 28 29 For j = 0 To 9 Step 1 30 31 FoldeName = doc.getElementsByTagName("h3")(j).innerHTML 32 33 FoldeName1 = Left(FoldeName, InStr(FoldeName, ":") - 1) 34 FoldeName2 = Mid(FoldeName, InStr(FoldeName, ":") + 1) 35 36 FoldeName1 = Mid(FoldeName1, InStr(FoldeName, ">") + 1) 37 FoldeName2 = Mid(FoldeName2, InStr(FoldeName, ">") + 1) 38 39 FoldeName = FoldeName1 + FoldeName2 40 41 FoldeName = Replace(FoldeName, "</a>", "") 42 FoldeName = Replace(FoldeName, "\", "") 43 FoldeName = Replace(FoldeName, "/", "") 44 FoldeName = Replace(FoldeName, ":", "") 45 FoldeName = Replace(FoldeName, ",", "") 46 FoldeName = Replace(FoldeName, ";", "") 47 FoldeName = Replace(FoldeName, "*", "") 48 FoldeName = Replace(FoldeName, "?", "") 49 FoldeName = Replace(FoldeName, """", "") 50 FoldeName = Replace(FoldeName, "<", "") 51 FoldeName = Replace(FoldeName, ">", "") 52 FoldeName = Replace(FoldeName, "|", "") 53 FoldeName = Replace(FoldeName, " ", "") 54 FoldeName = Replace(FoldeName, vbLf, "") 55 56 h = h + 1 57 SaveDir = basedir + CStr(h) + FoldeName 58 59 If Dir(SaveDir, vbDirectory) = "" Then 60 61 MkDir SaveDir 62 63 End If 64 65 On Error Resume Next 66 67 For k = 0 To 10 Step 1 68 69 70 71 DLurl = doc.getElementsByClassName("external")(j)(k).innerText 72 73 If DLurl = "" Then 74 DLurl = doc.getElementsByClassName("external")(j) 75 Filename = Mid(DLurl, InStrRev(DLurl, "/") + 1, Len(DLurl - InStrRev(DLurl, "/") + 1)) 76 Filename = Replace(FoldeName, "%", " ") 77 Else 78 Filename = DLurl 79 DLurl = doc.getElementsByClassName("external")(j) 80 End If 81 82 FileType = CStr(Right(DLurl, Len(DLurl) - InStrRev(DLurl, "."))) 83 84 lngRes = URLDownloadToFile(0, DLurl, SaveDir + "\" + Filename + "." + FileType, 0, 0) 85 86 SaveDir = "" 87 DLurl = "" 88 DeleteUrlCacheEntry StrPtr(DLurl) 89 90 Next 91 92 On Error GoTo 0 93 94 Next 95 96 Next 97 98 MsgBox "終わり" 99 100End Sub
アクセスしようとしている先って、どこか知らないですが、自動でアクセスして勝手にダウンロードしていい場所なのでしょうか。
いずれにしてもcodeのマークダウンできてませんので、質問本文調整してください
ダウンロードはしても大丈夫なサイトです
質問文修正しました
色々とパーズしてからダウンロードしたいファイルのURLを生成されているようですが、URLDownloadToFileは
HTTPレスポンスの"Content-Type:"や"Content-Length:"の指定にしたがってファイルに保存するものだったと思います。
ホームページのリンクから辿らないとファイルのダウンロードができない、直リンク禁止のようなサイトだと、リダイレクトされたりして期待しているデータは保存できない場合があります。ダウンロードしたファイルの内容をダンプして確認すると、リダイレクトされる際のhtmlだったりしますので、確認してみてください。
ご指摘のとおりHTMLのソースになっていました
では、たぶんそういうこと(直リン禁止)なのだと思います。ファイルのURLをブラウザのアドレスバーに直接入力してダウンロードできるようなところなら、本プログラムは使えるのでしょう。
DL URL を直にコピペできるのですが、何か間違っているのでしょうか?
ならば何か間違っているのではないでしょうか。プログラム中で正しくURLは生成されているのでしょうか。
URL 生成及び保存パスの生成はできています
であれば、これ以上は具体的なサイトを提示し、どのようなレスポンス(ファイル)が返ってきているか分からないとどなたも回答できないと思います。内部的にIEのコンポーネントを使う処理ですから、IEやWindows環境に関係しているかもしれません。
あなたの回答
tips
プレビュー