[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBAでPDFファイルをPOST送信』(あっつ)
とあるグループウェアのWEBAPIでファイルの登録をVBAで作成しているのですが
送信がうまくいかずエラーになります。いろいろと試しているのですが方法がわかりません。もう何日もこれに悩んでます。どなたかお助け下さい。
WEBAPI
ファイル登録(ユーザが編集可能なキャビネットにファイルを登録します。)
URL /api/file/add.do?
リクエストパラメータ
項目 パラメータ名 必須 値 説明
親ディレクトリSID fdrParentSid 〇 integer 親フォルダSID
添付ファイル情報 uploadFile 〇 formFile 添付ファイル情報
VBA 処理抜粋
'PDFファイルの読み込み
cFileName = Worksheets("setting").Cells(i, 3)
iFileNo = FreeFile(0)
Open cFileName For Binary Access Read As #iFileNo
Do While Not EOF(iFileNo)
Get #iFileNo, , bBuf buf = buf & Hex(bBuf) Loop 'ファイルを閉じる Close #iFileNo
'パラメータ(必要に応じて動的に生成)
paramStr = "fdrParentSid="
paramStr = paramStr & Worksheets("setting").Cells(i, 1)
paramStr = paramStr & "&uploadFile="
paramStr = paramStr & buf
bPmary = StrConv(paramStr, vbFromUnicode)
'POST実行
Set xmlhttp = CreateObject("msxml2.xmlhttp")
xmlhttp.Open "POST", "http://URL/api/file/Add.do", False
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlhttp.send (bPmary)
'応答取得
retCd = xmlhttp.Status
If retCd <> 200 Then
GoTo Error Else Debug.Print retHtml End If
結果
org.apache.struts.chain.commands.InvalidPathException: No action config found for the specified url.
< 使用 Excel:Excel2007、使用 OS:Windows7 >
ただURLに関してはその前の処理でフォルダ情報を取得するAPIが動いていますので
間違えているとは思いにくいのです。
'POST実行
Set xmlhttp = CreateObject("msxml2.xmlhttp")
xmlhttp.Open "POST", "http://URL/api/file/cabinetl.do", False
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlhttp.send ("")
'フォルダ情報の取得
Set xmlDoc = CreateObject("Microsoft.XMLDom")
xmlDoc.async = False
fileValue = xmlDoc.Load(xmlhttp.responseXML)
パラメータの先頭の"&"はつけてみましたが駄目でした。
パラメータをUTF-8にしたり東試しましたがこれもダメでした。
どなたかご教示お願いいたします。
(あっつ) 2014/04/04(金) 17:11
>とあるグループウェアの などと情報を伏せないで、出来るだけ詳細な情報を提示してはどうでしょうか。 http://www.gs.sjts.co.jp/wbs/bulletin/bbs080.do?bbs010forumSid=4&threadSid=1988
おもしろそうなので、調べてみましたが、 http://www.gs.sjts.co.jp/v4/tec/api/index.html の MultipartRequestHandlerJa.CommonsFormFile を見ると、 formFile は 「内部的にはCommons FileUploadのFileItemをラップしただけです。 」 と書かれています。
「FileUpload Apache FileItem」で検索すると山のようにサンプルが見つかると思います が、基本的にはこれ相当の内容を送信する必要がありそうです。
下記を参照して試してみたら、こんなHTMLで登録できました(server は実際のホスト名を指定)。 https://commons.apache.org/proper/commons-fileupload/index.html
<html> <head><title>upload test</title></head> <body> <form method="POST" enctype="multipart/form-data" action="http://server/gsession/api/file/add.do"> File to upload: <input type="file" name="uploadFile"><br/> <input type="hidden" name="fdrParentSid" value="1"> <input type="submit" value="Press"> to upload the file! </form> </body> </html>
これ相当をスクリプトで制御したらできそうですけれど、HTMLを使った実装は既に試して いたでしょうか。
とりあえずご参考まで。
あれ、ここって EXCEL の学校だったよなぁ。 (Mook) 2014/04/07(月) 03:42
HTMLを使用してもUPLOADは確認できています。
その処理をVBAのみで記述するためXMLHTTPで作成しているのですが
POSTのパラメータのSENDがうまくいかず、困っているのですが
原因がわからず(パラメータ漏れ?記述間違い?文字コード?等)
VBAで同じ処理を作ったことがある方ならご存知かと思い
ここに質問させていただきました。
スレ違いであれば申し訳ありません。
もう少し調べてみます。
ご回答大変ありがとうございました。
(あっつ) 2014/04/07(月) 11:31
上で送れることが試せたのであれば、このあたりを参考にしてできないでしょうか。 http://trash-area.com/archives/649 http://www.w3.org/TR/1999/PR-html40-19990824/interact/forms.html#h-17.13.1 http://mochizuki.jimdo.com/2010/01/26/httprequest%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89/
パラメータは形式に従って整形する必要があるようです。
> あれ、ここって EXCEL の学校だったよなぁ。 は深い意味は無いので気にしないで下さい。 自分の回答を見て書いただけなので。 (Mook) 2014/04/07(月) 11:45
参考サイトを元に一応動作するサンプルができたので、ご参考までに。
FORM が内部的にどう展開されているか、Session がどう管理されているか、 深く理解する良い機会になりました。
'--------------------------------------------------------- Sub Sample() '--------------------------------------------------------- Const UserID = "Mook" Const PassWD = "OpenSesami" Const CabinetID = 1 FileUpload "D:\Sample.txt", CabinetID, USerID, PassWD End Sub
'--------------------------------------------------------- Sub FileUpload(filePath, CabID, UserID, PassWD) '--------------------------------------------------------- Const Server = "192.168.204.128:8080" Dim strBoundary: strBoundary = DateDiff("s", "1970/1/1 0:00:00", DateAdd("h", -9, Now))
Set objHTTP = CreateObject("MSXML2.XMLHTTP") Set Stream = CreateObject("ADODB.Stream") Stream.Open Stream.Type = 1 Stream.LoadFromFile filePath
objHTTP.Open "POST", "http://" & Server & "/gsession/api/file/add.do", False, UserID, PassWD objHTTP.SetRequestHeader "Content-Type", "multipart/form-data; boundary=""" & strBoundary & """"
Dim str str = "--" & strBoundary & vbCrLf str = str & "Content-Disposition: form-data; name=""fdrParentSid""" & vbCrLf & vbCrLf str = str & CabID & vbCrLf
str = str & "--" & strBoundary & vbCrLf str = str & "Content-Disposition: form-data; name=""uploadFile""; filename=""" & Dir(filePath) & """" & vbCrLf str = str & "Content-Type: text/plain" & vbCrLf & vbCrLf
str = str & Stream.Read() & vbCrLf str = str & "--" & strBoundary & "--" objHTTP.Send str MsgBox objHTTP.responseText End Sub
(Mook) 2014/04/08(火) 02:03
わざわざサンプルのご提示までありがとうございます。
サイトのサンプルを見ながら作っていたのですがなかなか動かず
当方に暮れていました。
早速参考にさせていただきます。
本当にありがとうございました。
(あっつ) 2014/04/08(火) 17:15
役に立ったようなら、何よりです。 こちらで作成している Web 関連のサーバプログラムにも役立つ内容でしたので 私も楽しみつつ勉強になりました。
簡易テストのために、送信ファイルは unicode を使用していますが、そのあたり 問題あるようでしたら調整してください。
(蛇足ですが、当方ではなく途方かな)
(Mook) 2014/04/08(火) 19:01
誤字失礼いたしました。。
(あっつ) 2014/04/08(火) 20:52
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.