How to send files via HTTP_POST with Excel using VBA?

34,819

Solution 1

This (using WinInet) is VB6 but should also work in VBA/Excel:

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

Solution 2

I'm successfully using the one below (it uses ADODB.Stream and WinHttp.WinHttpRequest.5.1):

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

(if website disappears, also available on Internet Archive)

Share:
34,819
jonathanbell
Author by

jonathanbell

Updated on January 12, 2020

Comments

  • jonathanbell
    jonathanbell over 4 years

    The question asked here: How can I send an HTTP POST request to a server from Excel using VBA? is almost exactly what I was looking for except that I am trying to send a number of files to the server. I googled further and found How do I upload a zip file via HTTP post using VBA? This was also good, but pretty discouraging - it seems like a lot of work (not just making an HTML form here...).

    Option #2 here: http://www.motobit.com/tips/detpg_post-binary-data-url/ (as cited in the question on SO noted above) seems like it would work well, but as I work in JS and CSS, I have no idea how to create FormData (the binary files to send to the server) in the example.

    Can anyone please help me? In essence, I want to send 3-6 files over HTTP_POST via VBA from inside Excel to a PHP script on a web server that is expecting form data such as . An HTML form to handle this would look like:

    <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>
    

    Thank you all in advance.

    EDIT -- Aug. 2nd 2012

    I'm still trying to work on this issue. I don't know VBA/6, pretty much just basic JS so I am a little lost. Here is what I have done so far:

    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
    

    The message boxes at the bottom of the script do output the server's headers and response (blank HTML page). I feel that there is something that I am not setting in the headers to make the server happy (note: trying commenting out Content-Type).

    If anyone out there has experience using the WinHttpRequest object in VBA/6 to POST a binary file via HTTP, please help! :)

  • Colin Stadig
    Colin Stadig about 7 years
    If you are using a 64 bit version of Excel then you will need to add PtrSafe to your declared functions. Example: Private Declare PtrSafe Function InternetAutodial
  • Colin Stadig
    Colin Stadig about 7 years
    I can't get this code to work... What library references do I need to make?
  • QHarr
    QHarr almost 6 years
    But with no explanation how it is deployed? An example would have made this so much more useful.