从网页下载文件(zip或jpg)

时间:2016-12-06 11:36:31

标签: html vba download

我在网页上下载图片(或有时会拉链)时遇到一些问题。 我已经检查了一些关于这个主题的论坛,他们大多数时候建议使用URLDownloadToFile函数。 我试图应用它,但它似乎没有用。

以下是我正在处理的网页类型示例:

这里的类型是jpg,但有时它可以是拉链。 对于jpg案例,我有两种方法可以做到:

  1. 点击查看按钮,这将打开一个包含仅1张图片的新网页,选择该网页并以某种方式下载图片,我不会# 39;无法做到 (有一个"将图片另存为"当您手动点击图片时,但如何使用VBA访问图片?):

                  objIE.document.frames(1).frames(1).document.getElementById("notPrintable").document.getElementsByName("view")(0).Click 'This clicks on the View Button
                  attachment_url = "https://pumapgf-row.bmwgroup.net/puma/case/showfile.do?selectedIndex=" & elem_id & "&filename=" & elem_name & "%20%7C%20jpg%20%7C%20" & end_url ' this is the url of the new webpage which is opened when I click the view button
    
                  Set objIE = IEWindowFromLocation(attachment_url) ' I select the new webpage
                  Set IEDoc = objIE.document ' set document on it
    

    来自这个新网页的html当然是jpg)看起来像这样:enter image description here 我试图做但不成功的是以这种方式使用URLDownloadToFile函数

     Dim myImages As IHTMLElementCollection
     Set myImages = IEDoc.getElementsByTagName("img")
     returnValue = URLDownloadToFile(0, myImages(0).href, "P:\Alex\ABC.img", 0, 0)
    

    在运行代码之前,无论是否创建这样的被调用文件,它都没有任何区别。我也试过.jpg,。img,.png。 myImages(0).href像这样结束:

    enter image description here

    所以我不知道.href是不是以.jpg或.img这样的结尾的事实是一个问题。

  2. 点击另存为按钮:对于jpg和zip文件均有效,因此这将是一个更好的解决方案。我当然设法点击它,但问题来自互联网显示这个enter image description here并且我不知道如何处理它的事实。

  3. 知道怎么做吗?

    编辑:Here is the properties window of the image

1 个答案:

答案 0 :(得分:1)

假设您有一个有效的下载URL(我无法根据您的问题中的网站进行测试),您需要做的就是测试文件是否是jpg是要下载它并检查存在JPEG file header

Public Function FileIsJpg(filepath As String) As Boolean
    Dim handle As Long
    handle = FreeFile
    Open filepath For Binary As #handle
    Dim header As Integer
    Get #handle, , header
    'Note the byte order.
    If header = &HD8FF Then
        Get #handle, , header
        If header = &HE0FF Or header = &H1FF Then
            FileIsJpg = True
        End If
    End If
    Close #handle
End Function

请注意,对于您的使用,这将需要错误处理,因为URLDownloadToFile仍然可以打开文件。我假设你有某种等待机制(它是一种非阻塞功能)。如果没有,您需要使用本机回调机制或猜测并使用Application.Wait或类似的东西。

使用示例:

Private Declare Function URLDownloadToFile Lib "urlmon" _
    Alias "URLDownloadToFileA" (ByVal pCaller As Long, _
    ByVal szURL As String, ByVal szFileName As String, _
    ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Private Const S_OK As Long = 0

Sub Examples()
    Const TestJpgUrl As String = "https://www.gstatic.com/webp/gallery/1.jpg"
    Const TestPngUrl As String = "https://www.gstatic.com/webp/gallery3/1.png"

    Dim target As String
    target = Environ$("TEMP") & "\test.png"
    If URLDownloadToFile(0, TestPngUrl, target, 0, 0) = S_OK Then
        'Wait for download to complete - a callback function would be better.
        Application.Wait Now + TimeSerial(0, 0, 1)
        MsgBox target & ": " & FileIsJpg(target)
    End If
    Kill target

    target = Environ$("TEMP") & "\test.jpg"
    If URLDownloadToFile(0, TestJpgUrl, target, 0, 0) = S_OK Then
        Application.Wait Now + TimeSerial(0, 0, 1)
        MsgBox target & ": " & FileIsJpg(target)
    End If
    Kill target
End Sub

请注意,您也可以用类似的方式明确测试zip files,但我会将其作为读者的练习。