如何使用VBA通过HTTP post上传zip文件?

时间:2010-10-15 04:53:02

标签: vba file-upload adodb http-post winhttp

这个问题已被其他人以某种形式多次提出,但大多数仍未得到答复,或者给出的答案是“使用C#,呃!”,顺便提一下,这是一个非答案。 ; - )

我想通过VBA将zip文件上传到Web服务器。服务器端代码已经存在且运行良好;它通过手动表单上传接受zip文件,并对zip文件的内容做一些事情。

理论上,我计划将zip文件的二进制内容转换为HTTP请求字符串,并使用WinHTTP库中的某些方法将其发送到服务器。如果一切顺利,服务器端脚本(在Perl中)应该无法判断文件是来自VBA还是浏览器并继续正常工作。

但是,将zip文件转换为HTTP请求字符串似乎不是很直接。

在线搜索似乎表明存在3种常见策略:

方法1:WinHTTP和二进制到HTTP请求字符串的手动编码

  • 涉及以二进制模式打开文件并手动应用某些编码voodoo将二进制流更改为HTTP请求字符串,并使用WinHTTP以其方式发送它。 可怕的代码量。

方法2:WinHTTP

  • 涉及使用ADODB.Stream。少于十行代码。

方法3:通过SendKeys自动化IE

  • 只有一个词来形容这个黑客:哎呀!如果还没有,可能会在IE的未来版本中打破。少于十行代码。 安全风险。

我倾向于方法2 ,但是,文档很薄,代码示例很少,并且不确定它是否有效。大多数代码示例都不完整,并且通常会有评论说它们不起作用。这种方法真的有效吗?

方法1 紧随其后。

方法3 请不要! (而不是使用C#,如果涉及到这一点。爱C#,只需要允许VBA)

任何人都有关于如何完成这项任务的好例子吗?

1 个答案:

答案 0 :(得分:3)

在对上述所有方法(以及更多)进行了大量的实验后,我使用了与“方法1”相当的东西 - 我正在使用来自http://www.motobit.com/tips/detpg_post-binary-data-url/的第(2)项,但是具有以下任务:

 Set http = CreateObject("WinHttp.WinHttprequest.5.1")

...而不是代码中建议的那个(我认为代码有点老了)。但它并不完美 - 例如,我到目前为止还无法在我拥有的旧Windows XP机器上工作(在Win7上运行正常)。