【问题标题】:File Download via shdocvw.dll with custom headers通过带有自定义标头的 shdocvw.dll 下载文件
【发布时间】:2019-06-27 10:49:14
【问题描述】:

我需要通过 vba 应用程序在 msaccess 中下载一个非常大的文件。

使用对象 MSXML2.ServerXMLHTTP.6.0 和 WinHttp.WinHttpRequest.5.1 会导致错误,指出没有足够的可用存储空间来完成此操作。因此,我使用了来自 shdocvw.dll 的 DoFileDownload 方法。 我想要做的是向函数发送的请求传递一个额外的标头(API 密钥)。

这大概是我想做的事情。

Private Declare Function DoFileDownload Lib "shdocvw.dll" _
  (ByVal lpszFile As String) As Long


Public Sub Download()
    sDownloadFile = StrConv(<link_to_download>, vbUnicode)
    'set a header before calling DoFileDownload
    Call DoFileDownload(sDownloadFile)
End Sub

我该如何解决这个问题?

【问题讨论】:

  • 欢迎来到 SO!请收下tour 并阅读How to Ask!办公是x86的?然后,您将 x86 进程的最大内存限制为 2GB。文件有那么大吗?
  • @ComputerVersteher 感谢您尝试帮助并欢迎我加入 SO!在看到其他人遇到类似问题后,我想到了 RAM 大小问题,但问题是该文件最多只有几百 MB(~250MB)。 Office版本为x86(32位)
  • 你能展示一些示例代码/链接吗?
  • 当然,请查看此链接。 pastebin.com/4NLabnfB 使用此代码,下载大于 ~250MB 的文件会导致错误。这就是我尝试使用 DoFileDownload 的原因。

标签: vba ms-access


【解决方案1】:

一次下载整个文件的 WebRequest 存储整个数据作为响应。

虽然有分块响应的选项,但使用Wget编码更少,但选项更多。

Private Sub DownloadFileWget()
Const PathToWget As String = "" 'if wget is not in path use  "Path\To\Wget"
Dim LinkToFile As String
Dim SavePath As String

With CreateObject("WScript.Shell")
    LinkToFile = "http://download.windowsupdate.com/microsoftupdate/v6/wsusscan/wsusscn2.cab" 'huge file > 500MB
    SavePath = "C:\doc" 'folder to save download
    .CurrentDirectory = SavePath
    .Run Chr(34) & PathToWget & "wget.exe" & Chr(34) & " --header='name: value' " & Chr(34) & LinkToFile & Chr(34) & " -N", 1, True
     ' -N: Continue download only if the local version is outdated.
End With
End Sub

【讨论】:

  • 我尝试使用 WScript.Shell 方法,但我使用的是 bitsadmin 而不是我的系统上不可用的 wget,但我收到了类型不匹配错误。这是我的代码的粘贴箱。有任何想法吗? pastebin.com/A972ebaF
  • 你的双引号不合适。 ""gets"inside 字符串,要结束字符串,您需要第三个 d 引号。更容易使用Chr(34)用于字符串内的双引号。将你的 shell 代码放入一个单独的字符串中,你可以调试。打印它。
  • 这是一个权限错误。在特权主机上进行了测试,并且可以正常工作。问题是,我的部署主机不会有提升的权限或 wget.exe。我仍然认为我们唯一的解决方案是 Internet Explorer API。
猜你喜欢
  • 2012-11-14
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 2011-03-03
  • 2014-02-18
相关资源
最近更新 更多