Как отправить файлы через HTTP_POST в Excel, используя VBA?

Вопрос, заданный здесь: Как я могу отправить HTTP-запрос POST на сервер из Excel, используя VBA? это почти то, что я искал, за исключением того, что я пытаюсь отправить ряд файлов на сервер. Я погуглил дальше и обнаружил, как я могу загрузить zip-файл через сообщение HTTP, используя VBA? Это было также хорошо, но довольно обескураживающе - это кажется большой работой (не просто создание HTML-формы здесь...).

Вариант № 2 здесь: http://www.motobit.com/tips/detpg_post-binary-data-url/ (как указано в вопросе о SO, упомянутом выше) кажется, что он будет работать хорошо, но, поскольку я работаю в JS и CSS, я не знаю, как создать FormData (двоичные файлы для отправки на сервер) в этом примере.

Кто-нибудь может мне помочь, пожалуйста! По сути, я хочу отправить 3-6 файлов по HTTP_POST через VBA из Excel в 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>

Спасибо всем заранее.

РЕДАКТИРОВАТЬ - 2 августа 2012

Я все еще пытаюсь работать над этим вопросом. Я не знаю 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).

Если у кого-то есть опыт использования объекта WinHttpRequest в VBA / 6 для отправки двоичного файла через HTTP, пожалуйста, помогите!:)

2 ответа

Решение

Это (с использованием WinInet) VB6, но также должно работать в VBA / Excel:

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

Я успешно использую приведенный ниже (он использует ADODB.Stream и WinHttp.WinHttpRequest.5.1):

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

(если сайт исчезает, также доступен в интернет-архиве)

Другие вопросы по тегам