使用VBA从Web服务器下载日志文件

设置

服务器生成位于https://myserver.com/logs/日志文件。 /logs目录使用.htaccess文件进行密码保护。 尝试访问https://myserver.com/logs/将提示用户input用户名和密码,以查看目录列表。

我在做什么:

我正在MS Excel中编写一个VBA脚本来从我的服务器上下载一个日志文件。 日志文件server.log位于/logs目录中。 我想在C:\Downloads\server.log下载文件到我的本地驱动器。 最终我想写一个for循环来下载多个文件,但我现在只想下载一个。

我遇到的问题是:

我得到<h1>Access Denied</h1>作为返回消息。 我没有看到任何文件下载。 奇怪的事情,虽然…昨天它会下载文件,但只有当我访问它,并通过IE打开它。 然后每个后续下载工作正常。 不过今天这个不行了。

我的function是下载一个文件:

 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 Function downloadLog() Dim URL As String Dim DestFile As String Dim Res As Long URL = "https://myserver.com/logs/server.log" DestFile = "C:\Downloads\server.log" Res = URLDownloadToFile(0&, URL, DestFile, 0&, 0&) If Res = 0 Then MsgBox "Success" Else MsgBox "Failure" End If End Function 

请帮助…我全都没有想法。

我在其他地方find了答案。 我在这里发布,以便遇到同样问题的其他人可以使用下面的相同function来完成相同的事情。

第一次尝试时,系统会提示您input用户名和密码,但其他任何尝试都是无缝的。 就像我想要的那样工作。

 Function FetchFile(sURL As String, sPath) Dim oXHTTP As Object Dim oStream As Object Set oXHTTP = CreateObject("MSXML2.XMLHTTP") Set oStream = CreateObject("ADODB.Stream") 'Application.StatusBar = "Fetching " & sURL & " as " & sPath oXHTTP.Open "GET", sURL, False oXHTTP.send If (oXHTTP.Status = 200) Then With oStream .Type = 1 'adTypeBinary .Open .Write oXHTTP.ResponseBody .SaveToFile sPath, 2 'adSaveCreateOverWrite .Close End With FetchFile = True Else FetchFile = False End If Set oXHTTP = Nothing Set oStream = Nothing 'Application.StatusBar = False End Function 

我遇到过类似的问题,这里是解决scheme:

使用ADODB.Stream对象

 Set oXHTTP = CreateObject("MSXML2.XMLHTTP") Set oStream = CreateObject("ADODB.Stream") 

我没有一个可以testing代码的类似网站,但是这里可能值得尝试。 微软有一个解决scheme,使用WinINet在本网站下标题为“通过调用WinInet或Urlmon函数的对象打开的URL”部分进行validation。 他们build议使用WinINet库。

首先,调用InternetOpen来获得一个HINTERNET句柄。 接下来,使用INTERNET_DEFAULT_HTTPS_PORT选项调用InternetConnect ,从而提供lpszUsernamelpszPassword

使用HttpOpenRequest和HttpSendRequest来请求文件url。

如果一切按计划进行,则可以调用InternetReadFile来获取数据。

以下是使用WinINet进行身份validation的示例,不确定哪些符合您的需要。