Загрузка файла zip с использованием веб-API приводит к повреждению файла - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть код VBA, который загружает ZIP-файл на основе URL-адреса и сохраняет его в папке. Тем не менее, загруженный файл поврежден. Загруженный файл с использованием кода VBA имеет размер файла значительно меньше, чем фактический файл. Ниже код, который я использую:

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 Declare Function DeleteUrlCacheEntry Lib "wininet.dll" Alias _
"DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long

Sub DownloadFile 
    Dim L as long
    L = URLDownloadToFile(0&, UrlFileName, DestinationFileName, 0&, 0&)

    If L = 0 Then
      Debug.Print "Download successful"
    Else
       Debug.Print "Download unsuccessful"
    End If
End Sub

` Сайт, на котором я загружаю файлы ZIP, требует входа в систему, и я захожу на сайт, прежде чем запустить указанный код VBA.

Пример URL (не истинный URL): https://www.samplewebsite.org/bsplink14/updownload/motorqcopia2.asp?vr=&name=VBGHFaz7243%5F20180424%5F0403%5FAirline%5FZCVDRFDBilling.zip&filtroread=true&extid=INDEFD1834262&rif=3373&s3s=47c7d4b47bc1c57cc4c6c29959dca0

Можете ли вы помочь мне в этом?

1 Ответ

0 голосов
/ 30 апреля 2018

Убедитесь, что вы ссылаетесь на MSXML, вставляете модуль класса и в него следующий код. Делайте DownloadToFile только в том случае, если функция возвращает True, должно работать.

Public Function DoLoginByPost(URL As String, strUser As String, strPassword As String) As Boolean

    Dim xHttp As MSXML2.XMLHTTP
    Dim sTICKER As String

    sTICKER = "user=" & strUser & "&pass=" & strPassword & "&logintype=login&pid=4&login=Login" 
    'Check this and edit accordingly by e.g. using the web developer tools in your browser when logging in regularly.
    'You should be able to identify what form data is being sent when loggin on.
    Set xHttp = New MSXML2.XMLHTTP
    xHttp.Open "POST", URL
    xHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    xHttp.send sTICKER

    Do Until xHttp.READYSTATE = 4
        DoEvents
    Loop

    If xHttp.Status = 200 Then
        DoLoginByPost = True
        Else:   DoLoginByPost = False
    End If

End Function



'After receiving "TRUE", alter your original code to:

Set xHttp = New MSXML2.XMLHTTP
xHttp.Open "Get", UrlFileName, False
xHttp.send

Do Until xHttp.ReadyState = 4
  DoEvents
Loop

Open DestinationFileName For Binary As #1
   Put #1, , xHttp.responseBody
Close #1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...