2012-06-08 2 views
5

Вопрос, заданный здесь: How can I send an HTTP POST request to a server from Excel using VBA? - это почти то, что я искал, за исключением того, что я пытаюсь отправить на сервер несколько файлов. Я googled дальше и нашел How do I upload a zip file via HTTP post using VBA? Это было также хорошо, но довольно обескураживающе - кажется, что большая работа (не просто создание HTML-формы здесь ...).Как отправить файлы через HTTP_POST с помощью Excel с помощью VBA?

Вариант № 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> 

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

EDIT - 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 для POST бинарного файла по HTTP, пожалуйста, помогите! :)

+0

Какие файлы: текстовые или двоичные? –

+0

Можете ли вы отправить файлы по одному? Или это не вариант? – ikh

+0

@TimWilliams бинарный, Excel файлы. – jonathanbell

ответ

11

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

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

+0

еще раз спасибо, хорошая находка! whef. – jonathanbell

+1

Это сработало и сейчас в производстве! :) – jonathanbell

+0

Если вы используете 64-разрядную версию Excel, вам нужно будет добавить PtrSafe к вашим объявленным функциям. Пример: Private Declare PtrSafe Функция InternetAutodial –