HttpRequestでファイルのアップロード

かなり前から後回しにしてきたHttpRequestのファイルアップ処理。

今日ようやく本腰を入れて調査しました。

 

3月から本格稼働し始める自社サービスがあるんですが、

システムから出力されたCSVファイルをWEBサーバにアップロードする

必要が生じました。

 

 

これまでにFTP、SFTPによるファイルのアップロードとダウンロードの仕組みは

作ってきたものの、HTTP経由のアップロードは避けていました。

ヘッダー部、データ部のリクエストを生成しなきゃいけないのはわかっていたものの、

正確な記述方法を知らず。

というよりも、HTTP経由でアップロードする必要がなかった。汗

 

 

で、急遽必要に迫られ仕方ないから調べ始めたわけでございます。

 

さて、サンプルコードはあるかなと思ったものの、

VB.NETやC#などでの方法は少し紹介されているけど、

VBAによるアップロードのコードがどこにもない。

 

Googleで探しても日本語サイトだけではイマイチこれというページがなく、

海外サイトも調べ始めて、やっと参考情報が見つかりました。

 

http://www.w3.org/TR/1999/PR-html40-19990824/interact/forms.html#h-17.13.1

こちらの一番下、「multipart/form-data」から説明が載っています。

 

ということでコーディングしてみました。

 

 

---------------------

Dim HttpRequest As Object
Dim str As String

Dim S As String

Set HttpRequest = CreateObject("MSXML2.XMLHTTP.3.0")
HttpRequest.Open "POST", "http://hogehoge.com/test.php", False
HttpRequest.setRequestHeader "Content-Type", "multipart/form-data; boundary=""AaB03x"""  '//通常のPOSTの場合:application/x-www-form-urlencoded

'// $_POST['textbox']に"TEST"が入る
str = str & "--AaB03x" & vbCrLf
str = str & "Content-Disposition: form-data; name=""textbox""" & vbCrLf & vbCrLf
str = str & "TEST" & vbCrLf
'// $_FILES["submitfile"]にBook1.csvが入る
str = str & "--AaB03x" & vbCrLf
str = str & "Content-Disposition: form-data; name=""submitfile""; filename=""Book1.csv""" & vbCrLf
str = str & "Content-Type: text/plain" & vbCrLf & vbCrLf
'// Book1.csvの中身を書き出す
str = str & "... contents of Book1.csv ..." & vbCrLf
str = str & "--AaB03x--"
  

'// HttpRequestを送信する
HttpRequest.send (str)

'// レスポンスの確認
S = HttpRequest.responseText
MsgBox S
---------------------
上記の処理で無事にCSVデータをWEBサーバ上にアップロードできました。
ヘッダー情報とか調整するのに苦労した〜。
ちなみにboundaryのデータはユニークのものでなければいけません。
文字列は適当で大丈夫です。
あとバイナリデータを送信する際は記述の仕方が若干異なるので、
注意が必要です。
とりあえず今回は必要ないので実行テストはしていません。
備忘録まで。
---------------------
'// バイナリデータを送信する場合
Content-Type: multipart/form-data; boundary=AaB03x

--AaB03x
Content-Disposition: form-data; name="submit-name"

Larry
--AaB03x
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=BbC04y

--BbC04y
Content-Disposition: attachment; filename="file1.txt"
Content-Type: text/plain

... contents of file1.txt ...
--BbC04y
Content-Disposition: attachment; filename="file2.gif"
Content-Type: image/gif
Content-Transfer-Encoding: binary

...contents of file2.gif...
--BbC04y--
--AaB03x--
---------------------
もちづき