クライアント(axios)からPOSTしたファイルをサーバーサイド(flask)で取得する方法について.
基本的には,
- axiosから, multipart/form-data形式でファイルをPOSTする
- flask.request.filesから取得する
という流れで実装する.
1. multipart/form-data で POST
$ yarn add axios
npmを使ってる場合はそちらから.
Filesの取得は, ファイルリスト を用います.
import axios from 'axios';
// <input id="file" type="file">
const file = document.getElementById('file').files[0];
const formData = new FormData();
formData.append("file", this.file);
axios.post('/api/upload', formData, {
headers: {
'content-type': 'multipart/form-data'
}
}).then(response => {
console.log(response);
});
2. flask側で取得
まずは, pip でflask_restfulを取得します.
$ pip install flask_restful
appの作成はflaskを使えば当然すると思うのでその辺は割愛します.
from flask_restful import Api
from apis import UPLOADAPI
app.config['MAX_CONTENT_LENGTH'] = 1024 ** 3
api.add_resource(UPLOADAPI,
'/api/upload')
# apis.py
from flask_restful import Resource
from flask import request
class UPLOADAPI(Resource):
def __init__(self):
super(UPLOADAPI, self).__init__()
def post(self):
file = request.files['file']
path = rootpath + f"/files/{file.filename}"
file.save(path.path)
return {'message': 'from post'}
これで, root/files/ファイル名に保存されます.