늒네 기록

[flask] 파일 받아와서 저장하기 - 1 본문

서버 공부 기록/python flask

[flask] 파일 받아와서 저장하기 - 1

jaeha lee 2020. 10. 10. 03:48

https://flask.palletsprojects.com/en/1.1.x/patterns/fileuploads/

 

Uploading Files — Flask Documentation (1.1.x)

Uploading Files Ah yes, the good old problem of file uploads. The basic idea of file uploads is actually quite simple. It basically works like this: A tag is marked with enctype=multipart/form-data and an is placed in that form. The application accesses th

flask.palletsprojects.com

해당 페이지의 내용을 읽으면서 필요한 부분을 가져와서 사용해보며 포스트를 작성했다.

 

위 도움말 페이지의 코드에서 에러 처리 부분을 없애고 저장 부분만 남긴다면 아래와 같은 코드가 될 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
from flask import Flask, request
from werkzeug.utils import secure_filename
 
app = Flask(__name__)
 
@app.route('/submit', methods=['POST'])
def submit():
    f = request.files['file']
    f.save('./files/' + secure_filename(f.filename))
    return 'done!'
 
if __name__ == '__main__':
    app.run()
cs

주요 내용을 한 줄씩 뜯어보자.

8번 줄에서는 post 방식으로 보낸 리퀘스트에서 file을 받아 변수 f에 넣어주었다.

- 서버가 파일이 포함된 리퀘스트를 받으면 파일은 request.files['file']에 포함되어있다. 이때, f의 타입을 받아서 프린트해보면 <class 'werkzeug.datastructures.FileStorage'>라고 나오는데, 이 클래스에 대한 좀 더 자세한 설명은 아래 링크에 나와있다.

https://werkzeug.palletsprojects.com/en/1.0.x/datastructures/#werkzeug.datastructures.FileStorage

 

Data Structures — Werkzeug Documentation (1.0.x)

Data Structures Werkzeug provides some subclasses of common Python objects to extend them with additional features. Some of them are used to make them immutable, others are used to change some semantics to better work with HTTP. General Purpose Changelog C

werkzeug.palletsprojects.com

9번 줄에서는 받은 파일을 '{앱이 실행되고 있는 경로}/files/{파일 이름}' 경로에 저장한다.

- 위의 자료구조 링크를 보면 알 수 있는데, f.filename으로 리퀘스트에 실려온 파일의 이름을 받을 수 있다.

- f.save로 특정 경로에 파일을 저장할 수 있다. 위의 코드에서는 파일이 저장될 폴더를 직접 써놓았지만, 업로드 폴더를 app 레벨에서 지정해주는 것이 가능하다. 이에 대해서는 다음 글에서 좀 더 설명하도록 하겠다.

- secure_filename이라는 함수를 통해 파일 이름을 받아왔다. 이렇게 하는 이유는, 글 도입부에 걸어놓은 링크에도 잘 설명되어있지만, 어떤 유저가 절묘하게 파일 이름을 '../../../home/username/.bashrc' 같은 걸로 해두고 저장했더니 실제 경로 depth가 딱 맞아떨어져서 해당 파일이 바꿔치기 당할 위험이 있는데, secure_filename함수가 이런 일을 미연에 막아주기 때문.

 

위의 코드로 도는 서버를 올린 다음, 코드가 실행되고 있는 경로에 files라는 폴더를 만들고, /submit 주소로 파일을 포함하여 post 리퀘스트를 보내면, 보낸 파일이 files 폴더에 저장되는 것을 확인할 수 있다.

 

다음 글에서는 도입부 튜토리얼에서 어떤 예외처리를 했는지 살펴보고,

그 다음 글에서는 파일을 담은 post 리퀘스트를 날려보는 실습을 하기 위해 postman을 쓰는 방법을 살펴볼 것이다.

반응형

'서버 공부 기록 > python flask' 카테고리의 다른 글

[flask] 라우팅 (1)  (0) 2020.10.01
[flask] 시작하기  (0) 2020.09.27
Comments