【问题标题】:Download log file from web server using VBA使用 VBA 从 Web 服务器下载日志文件
【发布时间】:2013-12-17 04:04:41
【问题描述】:

设置

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

我想做的事:

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

我遇到的问题:

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

我的文件下载功能:

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

请帮助...我完全没有想法。

【问题讨论】:

  • 如果这是你的服务器,你为什么不直接使用windows授权而不是通过门户网站访问它?
  • 我不确定那是什么。我该怎么做?

标签: excel vba


【解决方案1】:

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

第一次尝试时会提示您输入用户名和密码,但其他所有尝试都是无缝的。就像我想要的那样工作。

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

【讨论】:

    【解决方案2】:

    我之前也遇到过类似的问题,解决方法如下:

    使用 ADODB.Stream 对象

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

    【讨论】:

      【解决方案3】:

      我没有可以测试代码的类似网站,但这里可能值得一试。在标题为“由调用 WinInet 或 Urlmon 函数的对象打开的 URL”部分下,Microsoft 提供了一个使用 WinINeton this site 进行身份验证的解决方案。他们建议使用 WinINet 库。

      首先,调用InternetOpen 获取 HINTERNET 句柄。 接下来,使用INTERNET_DEFAULT_HTTPS_PORT 选项调用InternetConnect,提供lpszUsernamelpszPassword

      使用HttpOpenRequestHttpSendRequest 请求文件网址。

      如果一切按计划进行,您可以致电InternetReadFile 获取数据。

      Here 是使用 WinINet 进行身份验证的示例,不确定哪个适合您的需要。

      【讨论】:

        猜你喜欢
        • 2015-04-04
        • 1970-01-01
        • 2020-07-02
        • 2016-03-28
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        相关资源
        最近更新 更多