🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

6052閲覧

vbs httpリクエスト multipart/form-data

coko1

総合スコア276

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/03/16 13:50

編集2021/03/22 01:30

現在VBSでBOXのAPIのファイルアップロードを実行するスクリプトを作成しているのですが、
リファレンス内に挙げられているcurlコマンドでの例で指定されているオプション-Fで列挙されている2行の指定方法がわかりません。
どのようにすればよいかわかる方がおりましたらご助力をお願い致します。

APIリファレンス↓
https://ja.developer.box.com/reference/post-files-content/#param-attributes-name

curl

1//curlでの実行例 2curl -i -X POST "https://upload.box.com/api/2.0/files/content" \ 3 -H "Authorization: Bearer <ACCESS_TOKEN>" \ 4 -H "Content-Type: multipart/form-data" \ 5 -F attributes="{"name":"Contract.pdf", "parent":{"id":"11446498"}}" \ 6 -F file=@<FILE_NAME>

VBSでのhttpリクエストの方法は下記URLを参考にしています。
https://qiita.com/danishi/items/34d086fc466d5aa1df65

vbscript

1Set http = CreateObject("WinHttp.WinHttpRequest.5.1") 2 3With http 4 .Open "POST", "https://upload.box.com/api/2.0/files/content", False 5 .SetRequestHeader "Authorization", "Bearer " & token 6 .SetRequestHeader "Content-Type", "multipart/form-data" 7 .Send postdata 8End With

◆20210317追記◆

boundary設定バージョン

vbs

1postdata = "" 2postdata = postdata & "--------------------------ABCDEFG" & vbCrLf 3postdata = postdata & "Content-Disposition: form-data; name=""attributes""" & vbCrLf 4postdata = postdata & vbCrLf 5postdata = postdata & "{""name"":""api_upload.txt"", ""parent"":{""id"":""123456789""}}" & vbCrLf 6postdata = postdata & "--------------------------ABCDEFG" & vbCrLf 7postdata = postdata & "Content-Disposition: form-data; name=""file""" & vbCrLf 8postdata = postdata & vbCrLf 9postdata = postdata & "C:\Users\ユーザー\Desktop\abc.txt" & vbCrLf 10postdata = postdata & "--------------------------ABCDEFG--" & vbCrLf 11 12Set http = CreateObject("WinHttp.WinHttpRequest.5.1") 13 14With http 15 .Open "POST", "https://upload.box.com/api/2.0/files/content", False 16 .SetRequestHeader "Authorization", "Bearer " & token 17 .SetRequestHeader "Content-Type", "multipart/form-data; boundary=------------------------ABCDEFG" 18 .Send postdata 19End With

###◆20210318追記◆
下記の指定でアップロードに成功しました。
20210317追記でのコードとほぼほぼ同じな気がしますが…

vbs

1postdata = "" 2postdata = postdata & "--------------------------ABCDEFG" & vbCrLf 3postdata = postdata & "Content-Disposition: form-data; name=""attributes""" & vbCrLf 4postdata = postdata & vbCrLf 5postdata = postdata & "{""name"":""api_upload.txt"", ""parent"":{""id"":""1234567""}}" & vbCrLf 6postdata = postdata & "--------------------------ABCDEFG" & vbCrLf 7postdata = postdata & "Content-Disposition: form-data; name=""file""; filename=""abc.txt""" & vbCrLf 8postdata = postdata & "Content-Type: application/octet-stream" & vbCrLf 9postdata = postdata & vbCrLf 10postdata = postdata & "aiueo" & vbCrLf 11postdata = postdata & "--------------------------ABCDEFG--" 12 13Set http = CreateObject("WinHttp.WinHttpRequest.5.1") 14 15With http 16 .Open method, requestUrl, False 17 .SetRequestHeader "Authorization", "Bearer " & token 18 .SetRequestHeader "Content-Type", "multipart/form-data; boundary=------------------------ABCDEFG" 19 .Send postdata 20End With 21コード

###◆20210322追記(成功版)◆
バイナリファイルのアップロードのためにpostdataをバイナリ形式で送信する必要があったので、
下記URLを参考にしてみたところ、元のファイル情報を保持したままファイルのアップロードができました。
http://trash-area.com/archives/649
https://spirits.appirits.com/doruby/8783/

vbs

1filePath = "C:\Users\ユーザー\Desktop\test.pdf" 2forderId = "1234567" 3boundary = "------------------------ABCDEFG" 4 5'リクエストパラメータ生成 6postData = SetPostData() 7 8'HTTPリクエストオブジェクト 9Set http = CreateObject("WinHttp.WinHttpRequest.5.1") 10 11With http 12 .Open "POST", "https://upload.box.com/api/2.0/files/content", False 13 .SetRequestHeader "Authorization", "Bearer " & token 14 .SetRequestHeader "Content-Type", "multipart/form-data; boundary=" & boundary 15 .Send postData 16End With 17 18'------------------------------------------------------- 19Function SetPostData() 20 adTypeBinary = 1 21 adTypeText = 2 22 23 ' ファイル名取得 24 Set fso = CreateObject("Scripting.FileSystemObject") 25 filename = fso.GetFileName(filepath) 26 Set fso = Nothing 27 28 ' アップロードファイルをバイナリ形式で読込 29 Set stream = CreateObject("ADODB.Stream") 30 stream.Type = adTypeBinary 31 stream.Open 32 stream.LoadFromFile filePath 33 fileContents = stream.Read 34 stream.Close 35 36 stream.Type = adTypeText 37 stream.Charset = "UTF-8" 38 stream.Open 39 40 ' バイナリデータの前まで 41 ChangeStreamType stream, adTypeText 42 params = "" 43 params = params & "--" & boundary & vbCrLf 44 params = params & "Content-Disposition: form-data; name=""attributes""" & vbCrLf 45 params = params & vbCrLf 46 params = params & "{""name"":""" & filename & """, ""parent"":{""id"":""" & forderId & """}}" & vbCrLf 47 params = params & "--" & boundary & vbCrLf 48 params = params & "Content-Disposition: form-data; name=""file""; filename=" & filePath & vbCrLf 49 params = params & "Content-Type: application/octet-stream" & vbCrLf 50 params = params & vbCrLf 51 stream.WriteText params 52 53 ' バイナリデータ 54 ChangeStreamType stream, adTypeBinary 55 stream.Write fileContents 56 57 ' 最後 58 ChangeStreamType stream, adTypeText 59 stream.WriteText vbCrLf & "--" & boundary & "--" & vbCrLf 60 61 ChangeStreamType stream, adTypeBinary 62 stream.Position = 0 63 formData = stream.Read 64 stream.Close 65 66 SetPostData = formData 67End Function 68 69Function ChangeStreamType(stream, t) 70 p = stream.Position 71 stream.Position = 0 72 stream.Type = t 73 stream.Position = p 74 Set ChangeStreamType = stream 75End Function

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

VBS

1postdata = "{""name"":""Contract.pdf"", ""parent"":{""id"":""11446498""}}&file=" & ファイルの中身

でしょうか。

#追記
間違えてました。マルチパート形式なので、マルチパートを自分で組み立てないといけませんね。

text

1Content-Type: multipart/form-data; boundary=------------------------ABCDEFG

にして、postdata

text

1--------------------------ABCDEFG 2Content-Disposition: form-data; name="attributes" 3 4{name:Contract.pdf, parent:{id:11446498}} 5--------------------------ABCDEFG 6Content-Disposition: form-data; name="file" 7 8ファイルの中身 9--------------------------ABCDEFG--

みたいにして下さい。
#追記2
ちょっと違ったようです。curlで投げられるのはこんな感じ。

text

1--------------------------ABCDEFG 2Content-Disposition: form-data; name="attributes" 3 4{name:Contract.pdf, parent:{id:11446498}} 5--------------------------ABCDEFG 6Content-Disposition: form-data; name="file"; filename="ファイル名" 7Content-Type: application/octet-stream 8 9ファイルの中身 10--------------------------ABCDEFG--

しかし、そんなに違いはないので駄目かも知れませんが。

#追記3
バイナリーファイル読み込みの例:

VBScript

1Const adTypeBinary = 1 2Const adReadAll = -1 3 4Set ADO = CreateObject("ADODB.Stream") 5ADO.Type = adTypeBinary 6ADO.Open 7ADO.LoadFromFile "aaaaa.jpg" 8data = ADO.Read(adReadAll) 9ADO.Close 10 11WScript.Echo Lenb(data)

投稿2021/03/16 15:10

編集2021/03/21 01:03
otn

総合スコア85886

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coko1

2021/03/16 15:23

お世話になっております。 400 Bad Requestになってしまいました。 ファイルの中身は"C:\Users\ユーザー\Desktop\abc.txt"のような形で渡しています。 コマンドライン経由でのcurl実行はうまくいっているので、 指定の仕方の問題だとは思うのですが…
otn

2021/03/16 15:37

失礼しました。 マルチパートにしないといけませんね。面倒くさい。
coko1

2021/03/17 09:07 編集

お世話になっております。 返信まで時間が空いてしまい申し訳ありません。 ご提示いただいた内容を参考に実行してみましたが 400 Bad Requestになってしまいました。(スクリプトの内容は質問に追記済み) "ファイルの中身"はアップロード元ファイルのパスを指定する認識で誤りないでしょうか?
otn

2021/03/17 09:32

> "ファイルの中身"はアップロード元ファイルのパスを指定する認識で誤りないでしょうか? いや、名前じゃなくて中身です。ただ、お書きのコードでも「C:\Users\ユーザー\Desktop\abc.txt」という中身のファイルを送った体なので、エラーの原因では無いでしょう。 お書きのcurlコマンドで、私の管理するサーバーに投げてみて、サーバーが受け取ったものを見てみましたが、ちょっと違いましたね。追記します。
coko1

2021/03/17 09:44

中身というと、元ファイルの内容をそのままでアップロードしたい場合は指定不要でしょうか? また、元ファイルのパスはfilename="ファイル名"に指定する形になるのでしょうか?
otn

2021/03/17 09:51

> 中身というと、元ファイルの内容をそのままでアップロードしたい場合は指定不要でしょうか? すいません。意味が取れません。 > また、元ファイルのパスはfilename="ファイル名"に指定する形になるのでしょうか? フルパスじゃなくて、ファイル名でしょう。
coko1

2021/03/17 10:03

> >中身というと、元ファイルの内容をそのままでアップロードしたい場合は指定不要でしょうか? >>すいません。意味が取れません。 例えばファイルの中身を”あいうえお”としてテキストファイルをアップロードした場合は、 アップロードしたファイルの中身がもともと"ABCDE"という内容でも"あいうえお"となってしまうということでしょうか? >> また、元ファイルのパスはfilename="ファイル名"に指定する形になるのでしょうか? >>フルパスじゃなくて、ファイル名でしょう。 例えばデスクトップ上にあるabc.txtをアップロードしようとした場合は、 filename="abc.txt"とすればよいのでしょうか。 そうするとデスクトップ上に存在するabc.txtという指定はどこの記述をもって確定するのでしょうか。 理解不足で申し訳ないですが、引き続きよろしくお願いいたします。
otn

2021/03/17 10:19

> 例えばファイルの中身を”あいうえお”としてテキストファイルをアップロードした場合は、 アップロードしたファイルの中身がもともと"ABCDE"という内容でも"あいうえお"となってしまうということでしょうか? これも意味がわかりません。アップロードしたいファイルの中身は何なのでしょう? > そうするとデスクトップ上に存在するabc.txtという指定はどこの記述をもって確定するのでしょうか。 デスクトップ上にあるファイルであるという情報はサーバーには送りません。不要なので。 ファイル名とファイルの内容だけを送ります。
coko1

2021/03/17 10:38

>これも意味がわかりません。アップロードしたいファイルの中身は何なのでしょう? すみません、ファイルの中身がどんな値であってもその値のままアップロードさせたいということです。 >デスクトップ上にあるファイルであるという情報はサーバーには送りません。不要なので。 >ファイル名とファイルの内容だけを送ります。 上の質問と重複してしまう気がしますが、 つまりはアップロードしたいファイルの内容をそのまま保持したい場合には、 ファイルの内容をスクリプト内で事前に読み取っておく必要があるということでしょうか? いまいち理解が及んでいないのですが、サーバーにアップロードファイルのパスを渡す必要がなく、ファイル名と内容のみを渡すということは、渡されたファイル情報をもとにサーバー側でファイルを新たに作成しているということなのでしょうか?
otn

2021/03/17 10:47

> ファイルの内容をスクリプト内で事前に読み取っておく必要があるということでしょうか? もちろんそうです。その内容をpostdataの中に埋め込みます。 > 渡されたファイル情報をもとにサーバー側でファイルを新たに作成しているということなのでしょうか? サーバー側が受け取るのはあくまでファイル内容が埋め込まれたpostdataなので、受け取ってメモリ上で処理するだけなのか、サーバー上のファイルに書くのかは、サーバー側のプログラム次第です。 クライアント側でアップロード処理をしたからと言って、サーバー上でファイルが出来るとは限りません。
coko1

2021/03/18 13:23

お世話になっております。 度々返信が遅れてしまい申し訳ありません。 "追記2"でご提示していただいたpostdataで処理を行ったところ、 無事にアップロードすることができました。 単純なテキストファイルの読み込み結果をpostdataに設定することまではできたのですが、 エクセルファイルなどの純粋のテキストデータでは読めないファイル情報を渡すにはどのように したらよいでしょうか。
otn

2021/03/18 15:12

FileSystemObjectだとバイナリーファイルは扱えないですよね。 何らかの外部コマンドでテキスト化して、読み込んだ後でバイナリーに戻すとかでしょうか。
otn

2021/03/21 00:42

思い出しましたが、FileSystemObject じゃなくて、ADODB.Streamを使うと、バイナリーで読めます。 追記しておきます。
coko1

2021/03/22 01:35

お世話になっております。 ご連絡遅れてしまい申し訳ありません。 バイナリ形式で送信する必要があるとの助言をいただいてから、 自分なりに調べながらやっていたため日数が空いてしまいました。 先日、otnさんが追記してくださっていた方法に私も行きつき、 いくつかのページを参考にしてバイナリファイルのアップロードに成功しました。 (コードは追記済みです) この度は本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問