[[20140404154224]] 『VBAでPDFファイルをPOST送信』(あっつ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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 >


apacheのメッセージを読むと、URLが違う、と言ってますね。ポストする文字列が問題?
または、パラメータの先頭に"&"が足りないとかないでしょうか?
(???) 2014/04/04(金) 16:44

ご返答ありがとうございます。

ただ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

Mook様

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


Mook様

わざわざサンプルのご提示までありがとうございます。

サイトのサンプルを見ながら作っていたのですがなかなか動かず
当方に暮れていました。

早速参考にさせていただきます。

本当にありがとうございました。
(あっつ) 2014/04/08(火) 17:15


 役に立ったようなら、何よりです。
 こちらで作成している Web 関連のサーバプログラムにも役立つ内容でしたので
 私も楽しみつつ勉強になりました。

 簡易テストのために、送信ファイルは unicode を使用していますが、そのあたり
 問題あるようでしたら調整してください。

 (蛇足ですが、当方ではなく途方かな)

(Mook) 2014/04/08(火) 19:01


途方ですね。。。

誤字失礼いたしました。。
(あっつ) 2014/04/08(火) 20:52


本スレにも解決した旨を記載してくださいね。
(kon) 2014/04/21(月) 10:39

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.