본문 바로가기
Coding/Python

Flask-restplus 파일/이미지 업로드하는 방법

by Hide­ 2018. 8. 19.
반응형

Flask로 Restful API를 만들기위해 라이브러리를 찾아보면

flask-restful, flask-restplus등 다양한 라이브러리가 존재한다.

각 라이브러리마다 사용법 또한 다르며 장점, 단점도 다르기 때문에 document를 잘 살펴보고 결정해야한다.

나는 현재 restplus를 사용하여 구축하고 있다.

따라서 오늘 포스팅에서는 restplus를 사용하여 이미지를 업로드하는 방법을 살펴본다.

먼저 파일 형식을 인자로 받기 위해서는 FileStorage 타입을 사용해야 한다.

아래의 코드를 먼저 상단에 추가한다.


from werkzeug.datastructures import FileStorage
from werkzeug.utils import secure_filename

secure_filename은 보안을 위해 사용한다.

그리고 아래의 라인을 통해 인자를 파싱한다.


parser.add_argument('image', type=FileStorage, location='files')
args = parser.parse_args()
images = args['image']
images.save('./upload/{0}'.format(secure_filename(image.filename)))

위처럼 코드를 작성해주면, /upload/라는 폴더에 사용자가 업로드를 한 파일명 그대로 파일이 저장된다.

추가적으로 여러개의 파일을 업로드할수도 있다.

여러개의 파일을 업로드하는 경우에는 add_argument부분에 action='append'를 추가해주면 된다.


parser.add_argument('image', type=FileStorage, location='files', action='append')

마지막으로 풀 소스는 아래와 같다.


ALLOWED_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif']

class ArticleList(Resource):
def get(self):
return {"status":"hide"}

def post(self):
parser = reqparse.RequestParser()
parser.add_argument('image', type=FileStorage, location='files', action='append')
args = parser.parse_args()
images = args['image']

for image in images:
extension = image.filename.split('.')[-1]
if extension in ALLOWED_EXTENSIONS: # 확장자 검사
image.save('./upload/{0}'.format(secure_filename(image.filename)))
else:
return {"status":"false", "result":"Not allowed extension"}

return {"status":"true", "result":"Upload success"}