programming

플라스크 파일 업로드 구현하기


by Kitle · 2021. 02. 11.



오늘은 게시판에 올라온 질문을 토대로 플라스크에서 파일을 업로드 하는 방법을 작성해보고자 합니다. 파일을 로컬PC에 업로드(복사)해보고, 그다음 서버에 올려서 해보겠습니다. 바로 시작하겠습니다. 따라오시죠.


플라스크 서버 구축하기

플라스크 서버 소스 구성은 다음과 같이 구성하겠습니다.

from flask import Flask, flash, redirect, render_template, request, url_for, send_from_directory, session
from werkzeug.utils import secure_filename
import os

app = Flask(__name__)
app.secret_key = "super secret key"
app.config['UPLOAD_FOLDER'] = '/Users/yourname/Uploads/'

@app.route('/upload')
def upload_file():
return render_template('upload.html')


@app.route('/uploader', methods=['GET', 'POST'])
def uploader_file():
if request.method == 'POST':
file = request.files['file']
file.save(os.path.join(app.config['UPLOAD_FOLDER'], file.filename))
return 'file uploaded successfully'


if __name__ == '__main__':
app.debug = True
app.run()
생각보다 간단하죠?

우선은 어떤 폴더에 올릴지 폴더 지정이 중요합니다. 저는 맥북인 관계로 위와 같이 구성되었습니다. 윈도우즈 이신 분은 해당 환경에 맞게 변경해주시면 될 것 같습니다. 그리고 해당 폴더는 반드시 생성되어 있어야 합니다. 없는 경우도 새로 생성하는 방법이 있겠지만 여기서는 그냥 만들어 두고 진행하도록 하겠습니다.

upload.html 파일 만들기
그다음은 upload.html 화면을 통해 올릴 것입니다. 소스부터 보시죠.
<html>
<body>
<form action="http://localhost:5000/uploader"
method="POST"
enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" />
</form>
</body>
</html>
이부분은 flask template 를 활용하여 만들었습니다. 반드시 templates 폴더 아래에 upload.html 를 넣어야 하는 규칙이 있습니다. 해당 위치에 넣지 않으면 upload.html 을 찾을 수 없는 오류가 발생할 것입니다. 해당 폴더를 만들고 해당 html 파일을 저장합니다.

로컬에서 파일 업로드 해 보기

바로 업로드를 해보죠. 플라스크 서버를 띄우고 localhost:5000/upload 위치로 진입해봅니다.

폴더에 있는 테스트 파일을 하나 선택하면 화면에 해당 파일명이 표시됩니다. 이후  제출 버튼을 눌러 봅니다.


파일 업로드 표시가 완성 되었습니다. 이제 해당 폴더에 가서 파일이 실제 업로드(복사) 되었는지 체크 합니다. 저는 잘 되었네요.
사실 예외처리가 아직 많이 되어 있지 않아서 파일이 실제로 업로드 되지 않았음에도 해당 메세지가 뜰 수 있습니다. 이점 주의하시기 바랍니다.

실제 서버에 반영하고 업로드 하기 - Pythonanywhere 호스팅

pythonanywhere의 경우 크게 어려울 것이 없습니다. 플라스크 서버 실행까지는 저의 다른 포스트를 참고하시어 진행먼저 부탁드립니다. https://kitle.xyz/post/61/ 참고하시면 됩니다.

서버 실행에 어려움 없으신 분은 이어서 진행하시면 됩니다.

우선은 파일 업로드할 경로를 알아야 합니다. 해당 서버의 경로를 아는 방법을 알려드리겠습니다.

pythonanywhere에 로그인하여 web 메뉴에 들어가면 나의 주소를 알 수 있습니다.

pythonanywhere의 주소는  /home/yourid/yourproject/ 형식의 구조를 가지고 있습니다.

여기에 우선 template 와 upload 폴더를 만들겠습니다.

Directories 하단에 각각의 폴더 이름을 입력하고 New directory 를 각각 클릭하여 폴더를 만들어 줍니다. 물론 콘솔에 접속하여 mkdir로 만드셔도 됩니다.

그다음은 아까 만들어 두었던 upload.html 를 업로드 합니다. 하지만 해당 업로드 주소가 http://localhost:5000/upload를 바라보고 있을 겁니다 이 부분을 http://yourname.pythonanywhere.com/uploader 로 수정하여 업로드 합니다. 업로드 후 수정하여도 무방합니다.

그다음은 원 소스 파일의 upload 폴더 위치도 로컬 위치가 아닌 서버의 위치로 변경해 둡니다.

from flask import Flask, flash, redirect, render_template, request, url_for, send_from_directory, session
from werkzeug.utils import secure_filename
import os

app = Flask(__name__)
app.secret_key = "super secret key"
app.config['UPLOAD_FOLDER'] = '/home/yourname/mysite/uploads/'

@app.route('/upload')
def upload_file():
return render_template('upload.html')


@app.route('/uploader', methods=['GET', 'POST'])
def uploader_file():
if request.method == 'POST':
file = request.files['file']
file.save(os.path.join(app.config['UPLOAD_FOLDER'], file.filename))
with open('mylog.log', 'a') as f:
f.write(os.path.join(app.config['UPLOAD_FOLDER'], file.filename)+'\n')
return 'file uploaded successfully'

if __name__ == '__main__':
app.debug = False
app.run()
업로드 폴더의 위치를 app.config['UPLOAD_FOLDER'] = '/home/yourname/mysite/uploads/' 등으로 적절히 수정해 줍니다.
그리고 업로드시 로그로도 체크해 볼 수 있도록 파일을 남겼습니다. 그리고 마지막에 실서버이므로 디버그옵션을 False로 꺼주었습니다 아니면 True로 진행하시고, 테스트 완료 후 False로 변경하는것 잊지마세요.

실 서버에서도 문제없이 잘 돌아갑니다. 혹시 문제가 있다면 로컬 서버 설정 값이 바뀌지 않았는지, 폴더는 만들어져 있는지, 템플릿 폴더와 파일도 이상없는지 꼭 확인해보시기 바랍니다.

그리고 파일과 관련된 예외처리는 많이 보강해야 한다는점 참고하여주세요.

이상 마치겠습니다