如何使用VBA通过HTTP_POST与Excel发送文件?

时间:2012-06-08 18:35:32

标签: excel vba excel-vba http-post winhttprequest

这里提出的问题:How can I send an HTTP POST request to a server from Excel using VBA?几乎正是我所寻找的,除了我正在尝试向服务器发送大量文件。我进一步搜索,发现How do I upload a zip file via HTTP post using VBA?这也很好,但非常令人沮丧 - 这似乎是很多工作(不仅仅是在这里制作HTML表单......)。

这里的选项#2:http://www.motobit.com/tips/detpg_post-binary-data-url/(如上面提到的SO问题中所引用的)似乎可以很好地工作,但是当我在JS和CSS中工作时,我不知道如何创建FormData(在示例中,要发送到服务器的二进制文件)。

任何人都可以帮助我吗?本质上,我想通过VBA从HTTP内部通过HTTP_POST将3-6个文件从Excel内部发送到期望表单数据的Web服务器上的PHP脚本。处理此问题的HTML表单如下所示:

<form action="upload_file.php" method="post" enctype="multipart/form-data">
  <input name="userfile[]" type="file" /><br />
  <input name="userfile[]" type="file" /><br />
  <input name="userfile[]" type="file" /><br />
  <input type="submit" />
</form>

提前谢谢大家。

编辑 - 2012年8月2日

我仍在尝试解决这个问题。我不知道VBA / 6,几乎只是基本的JS所以我有点失落。以下是我到目前为止所做的事情:

Sub HTTPInternetPutFile()

    ' create new object with WinHttpRequest for this operation
    Dim WinHttpReq As Object
    Set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
    Dim FormFields As String

    ' initialize variables that we will set and pass as parameters
    Dim sfpath
    Dim strURL As String
    Dim StrFileName As String


       StrFileName = "CLIPrDL.csv"
       sfpath = "C:\CLIPr\"
       strURL = "http://s0106001c10187ab1.gv.shawcable.net/uploadtest/upload_file.php"


       WinHttpReq.Open "POST", strURL, False


       ' Set headers
       WinHttpReq.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
       WinHttpReq.setRequestHeader "Accept-Charset", "ISO-8859-1,utf-8"
       WinHttpReq.setRequestHeader "Content-Type", "multipart/form-data"
       ' WinHttpReq.setRequestHeader "Content-Type", "text/html;charset=UTF8"
       WinHttpReq.setRequestHeader "Content-Disposition", "form-data; name=""userfile[]"""

       ' I dont understand this... why use fileup??
       FormFields = """filename=" & StrFileName & """"
       FormFields = FormFields & "&"
       FormFields = FormFields & sfpath

       ' so comment it out for now
       ' WinHttpReq.Send FormFields
       WinHttpReq.Send sfpath & StrFileName

       ' output this var to a message box becuase I dont know what it does really
       MsgBox FormFields
       ' Display the status code and response headers.
       MsgBox WinHttpReq.GetAllResponseHeaders
       MsgBox WinHttpReq.ResponseText


End Sub

脚本底部的消息框会输出服务器的标题和响应(空白HTML页面)。我觉得有些东西我没有设置在标题中以使服务器满意(注意:尝试注释掉Content-Type)。

如果有人在VBA / 6中使用WinHttpRequest对象通过HTTP发布二进制文件的经验,请帮忙! :)

2 个答案:

答案 0 :(得分:13)

这(使用WinInet)是VB6,但也可以在VBA / Excel中使用:

http://wqweto.wordpress.com/2011/07/12/vb6-using-wininet-to-post-binary-file/

答案 1 :(得分:1)

我成功使用下面的那个(它使用ADODB.Stream和WinHttp.WinHttpRequest.5.1):

http://www.ericphelps.com/scripting/samples/reference/web/http_post.txt

(如果网站消失,也是available on Internet Archive