Страницы: 1
RSS
VBA Excel выгрузка больших файлов, Не получается выгрузить большие файлы Msxml2.ServerXMLHTTP.6.0
 
Добрый день. Столкнулся с проблемой. Написал скрипт выгрузки  и сохранения файлов с внутреннего сайта компании. Структура кода следующая:
Код
Public Function GetResult_Get_Save(sUrl As String, sFileName As String)
   Dim httpObject1 As New MSXML2.ServerXMLHTTP60   'Object
   Set httpObject1 = CreateObject("Msxml2.ServerXMLHTTP.6.0")
Set httpObject = Nothing

    httpObject1.Open "GET", sUrl, False

httpObject1.setRequestHeader "accept", "*/*" '"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
httpObject1.setRequestHeader "accept-Encoding", "gzip , deflate, br"
httpObject1.setRequestHeader "accept-language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"
httpObject1.setRequestHeader "cache-Control", "no-cache"
httpObject1.setRequestHeader "cookie", ".........."
httpObject1.setRequestHeader "pragma", "no-cache"
httpObject1.setRequestHeader "referer", "...."
httpObject1.setRequestHeader "sec-ch-ua", """ Not A;Brand"";v=""99"", ""Chromium"";v=""98"", ""Google Chrome"";v=""98"""
httpObject1.setRequestHeader "Sec-ch-ua-mobile", "?0" '"Print 0"
httpObject1.setRequestHeader "sec-ch-ua-platform", """Windows"""
httpObject1.setRequestHeader "Sec-fetch-dest", "document"
httpObject1.setRequestHeader "Sec-fetch-Mode", "navigate"
httpObject1.setRequestHeader "Sec-fetch-site", "same-origin"
httpObject1.setRequestHeader "Sec-fetch-user", "?1" ' "Print 1"
httpObject1.setRequestHeader "upgrade-insecure-requests", "1"
httpObject1.setRequestHeader "user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
  httpObject1.sEnd
    'httpObject1.waitForResponse (100)
    
        Set ADOStream = CreateObject("ADODB.Stream")
        Debug.Print httpObject1.responseText
        ADOStream.Type = 1: ADOStream.Open
        ADOStream.Write httpObject1.responseBody
 
        ADOStream.SaveToFile "C:\_Project_\_tmp_\1\1\" & sFileName, 1
        ADOStream.Close:
        Set ADOStream = Nothing
        Set httpObject1 = Nothing
sTest = "Ok"
    
End Function

В целом код работает, но есть ограничение по размеру файла. Файлы грузятся размером менее 80Мб. У меня же есть необходимость грузить файлы без ограничения по размеру. Я не исключаю, что эта проблема не совсем Excel, а взаимодействия с конкретной информсистемой, откуда я качаю информацию. Кто что может посоветовать? Что можно попробовать? и куда посмотреть?

Помимо прочего пробовал WinHttp.WinHttpRequest.5.1 и MSXML2.XMLHTTP. Для первого ситуация та же, для второго не получается загрузить файл.

В дополнение, Ошибка возникает на Send. Код ошибки 2147012744 "Сервер вернул недопустимый или нераспознанный ответ". Ошибка появляется на одном и том же закачиваемом файле через разное время...иногда это 3 мин, иногда 6 мин. Chrom загружает файлы существенно быстрее чем мой код.
Изменено: ANDREY - 16.08.2022 16:43:41
 
Проще использовать специализированные средства, например curl (входит в последние версии Windows, иначе можно установить с сайта разработчика).

Код
Function Curl_Download(ByVal url As String, fileName As String)
  Dim retval
  With CreateObject("WScript.Shell")
    Curl_Download = .Run("%comspec% /c curl.exe " & url & " -s -o " & fileName, 0, True)
  End With
End Function
Владимир
 
Цитата
написал:
Проще использовать специализированные средства, например  curl  (входит в последние версии Windows, иначе можно установить с сайта разработчика).

Спасибо за ответ.

Пошел в этом направлении, но никак не могу написать корректный запрос в cUrl.

У меня есть минимальный запрос через MSXML2.ServerXMLHTTP60, который работает для небольших файлов:
Код
Sub test ()
   Dim httpObject1 As MSXML2.ServerXMLHTTP60    'Object
   Set httpObject1 = New MSXML2.ServerXMLHTTP60
   httpObject1.Open "GET", "https://...../attachment/allByType?attachmentId=841817&documentTypeId=19", False
   httpObject1.setRequestHeader "cookie", "JSESSIONID=C2DCA44E546D620399055A0912C75085;"
   httpObject1.sEnd
   Set ADOStream = CreateObject("ADODB.Stream")
   ADOStream.Type = 1: ADOStream.Open
   ADOStream.Write httpObject1.responseBody
   ADOStream.SaveToFile "C:\_Project_\_tmp_\1\1\dd.zip", 1
   ADOStream.Close:
End sub

Поскольку у меня есть еще элементы авторизации, то пробую то же реализовать через командную строку (для начала) что бы понять как работает данная утилита. К сожалению у меня ничего не выходит, явно где-то хромает синтаксис.
Код
curl -b “JSESSIONID=C2DCA44E546D620399055A0912C75085;” https://...../attachment/allByType -d “attachmentId=841817;documentTypeId=19” -o “C:\_Project_\_tmp_\1\1\dd.zip”
 
Цитата
написал:
Проще использовать специализированные средства, например  curl  (входит в последние версии Windows, иначе можно установить с сайта разработчика).
Владимир, спасибо огромное. Полдня провозился, но настроил загрузчик.

Теперь планирую разобраться с получением x-csrf-token и JSESSIONID через curl
 
Успехов! curl, на мой взгляд, является оптимальным (и эталонным) средством для решения подобных задач.
Владимир
Страницы: 1
Наверх