我正在尝试使用WinHTTP从https密码保护的网站保存文件。以下是代码:
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部分无法正常工作,因为如果我运行debug.print WHTTP.ResponseBody,它会输出html代码而不是实际的文件数据。
是否有一种方法可以将用户ID和密码传递给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
当我调试打印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网页本身,而不是文件。
我是否正确进行了身份验证,问题在于将文件保存到磁盘上还是仍然存在身份验证问题,导致无法保存?有任何线索吗?