Я пытаюсь сохранить файл с https-сайта, защищенного паролем, с помощью WinHTTP. Вот код:
Sub SaveFileFromURL()
Dim FileNum As Long
Dim FileData() As Byte
Dim WHTTP As Object
fileUrl = "https://www.website.com/dir1/dir2/file.xls"
filePath = "C:\myfile.xls"
myuser = "username"
mypass = "password"
Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1")
WHTTP.Open "GET", fileUrl, False
WHTTP.SetCredentials myuser, mypass, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
WHTTP.Send
FileData = WHTTP.ResponseBody
Set WHTTP = Nothing
FileNum = FreeFile
Open filePath For Binary Access Write As #FileNum
Put #FileNum, 1, FileData
Close #FileNum
MsgBox "File has been saved!", vbInformation, "Success"
End Sub
Проблема с аутентификацией. Файл сохраняется, но когда я открываю его в Excel, это просто html-страница входа в систему, а не сам файл. Если я копирую прямой URL-адрес файла и вставляю его в адресную строку браузера, и я не вошел на веб-страницу, эффект будет таким же. Мне представлена страница входа в систему. Затем, если я введу свой логин и пароль, появится окно загрузки, позволяющее мне сохранить файл.
Поэтому я думаю, что часть кода SetCredentials не работает должным образом, потому что если я отлаживаю. Print WHTTP.ResponseBody, это html-код вместо фактических данных файла.
Есть ли способ передать идентификатор пользователя и пароль в WinHTTP, чтобы я мог правильно сохранить файл?
Вот адрес страницы:
https://sst.msde.state.md.us/
======================= РЕДАКТИРОВАТЬ: ========================
Итак, я немного поиграл с этим сегодня и думаю, что двигаюсь вперед. Вот что у меня получилось. Я изменил код следующим образом:
Sub SaveFileFromURL()
Dim FileNum As Long
Dim FileData() As Byte
Dim WHTTP As Object
fileUrl = "https://www.website.com/dir1/dir2/file.xls"
filePath = "C:\myfile.xls"
myuser = "username"
mypass = "password"
strAuthenticate = "start-url=%2F&user=" & myuser & "&password=" & mypass & "&switch=Log+In"
Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1")
WHTTP.Open "POST", fileUrl, False
WHTTP.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
WHTTP.Send strAuthenticate
WHTTP.Open "GET", fileUrl, False
WHTTP.Send
Debug.Print WHTTP.GetAllResponseHeaders()
FileData = WHTTP.ResponseBody
Set WHTTP = Nothing
FileNum = FreeFile
Open filePath For Binary Access Write As #FileNum
Put #FileNum, 1, FileData
Close #FileNum
MsgBox "File has been saved!", vbInformation, "Success"
End Sub
Когда я Debug.Print WHTTP.GetAllResponseHeaders (), я получаю, например:
Accept-Ranges: bytes
Content-Disposition: attachement; filename="xxx"
Content-Length: xxxxxx
Content-Type: application/octet-stream
Итак, я думаю, что аутентификация сработала, но я все еще не могу сохранить файл. Когда я продолжу:
FileData = WHTTP.ResponseBody
Set WHTTP = Nothing
FileNum = FreeFile
Open filePath For Binary Access Write As #FileNum
Put #FileNum, 1, FileData
Close #FileNum
Содержимым сохраненного файла является сама html-страница, но не сам файл.
Я выполнил проверку подлинности правильно, и проблема заключается в сохранении файла на диск, или все еще существует проблема с проверкой подлинности, и поэтому я не могу ее сохранить? Какие-нибудь подсказки?