2020年10月23日金曜日

shell2http でファイルをアップロードする方法

概要

shell2http でファイルを受け取る方法を紹介します
クライアント側は curl, ruby, python で試してみました

環境

  • macOS 10.15.7
  • shell2http 1.13

準備

過去の記事を参考にインストールしてください

form を使ってファイルを受け取る

--form オプションを使います
受け取ったファイルの情報はリダイレクトすることでファイルとして保存します

  • shell2http --form /upload 'cat $filepath_uploadfile > uploaded_file.dat'

curl で試す

test.dat というファイルを送ってみます

  • curl -X POST -F uploadfile=@./test.dat localhost:8080/upload

サーバ側では uploaded_file.dat という名前で保存されているのが確認できると思います
また uploadfile= の部分がフォームとして送られるファイルの名前になるのでここが uploadfile2 などになるとリクエストは送信できますがサーバ側で指定のファイルがないため uploaded_file.dat が空で生成されます
エラーにならないので注意してください

Ruby で試す

net/http の post_form を使っています

require 'net/http'
require 'uri'

url = URI.parse('http://localhost:8080/upload')
http = Net::HTTP.new(url.host, url.port)

req = Net::HTTP::Post.new(url.path)
filename = 'test.dat'
f = open("./#{filename}")
query = [
  [ 'uploadfile', f, { uploadfile: filename } ]
]
req.set_form(query, "multipart/form-data")

ret = http.request(req)
ret.to_hash

Python で試す

標準ライブラリの urllib を使いたかったのですが情報が少なく requests を使いました

  • pipenv install requests
  • vim upload.py
import requests

url = 'http://localhost:8080/upload'
file = {'uploadfile': open('test.dat', 'rb')}
res = requests.post(url, files=file)
print(res)
  • pipenv run python upload.py

最後に

shell2http で form を使ってファイルを受け取る方法を紹介しました
クライアント側は POST で multipart/form-data でファイルを送信すれば良さそうです

0 件のコメント:

コメントを投稿