かなり前から後回しにしてきた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
str = str & "--AaB03x" & vbCrLf
str = str & "Content-Disposition: form-data; name=""textbox""" & vbCrLf & vbCrLf
str = str & "TEST" & vbCrLf
str = str & "--AaB03x" & vbCrLf
str = str & "Content-Disposition: form-data; name=""submitfile""; filename=""Book1.csv""" & vbCrLf
str = str & "Content-Type: text/plain" & vbCrLf & vbCrLf
str = str & "... contents of Book1.csv ..." & vbCrLf
str = str & "--AaB03x--"
'// HttpRequestを送信する
HttpRequest.send (str)
S = HttpRequest.responseText
MsgBox S
---------------------
'// バイナリデータを送信する場合
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--
---------------------
もちづき