[파이썬] Flask를 이용한 파일 업로드 및 다운로드

이번 포스트에서는 Python의 웹 프레임워크인 Flask를 사용하여 파일 업로드 및 다운로드 기능을 구현하는 방법에 대해 알아보겠습니다.

1. Flask 설치하기

Flask를 사용하기 위해서는 먼저 Flask를 설치해야 합니다. 다음 명령을 사용하여 Flask를 설치할 수 있습니다:

$ pip install flask

2. 파일 업로드 기능 구현하기

먼저 파일을 업로드하는 기능을 구현해보겠습니다.

from flask import Flask, request, redirect, url_for
from werkzeug.utils import secure_filename

app = Flask(__name__)

# 파일을 업로드할 폴더 설정
UPLOAD_FOLDER = './uploads'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

# 허용할 파일 확장자 설정
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])

# 허용할 파일인지 확인하는 함수
def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        # 파일이 업로드되는지 확인
        if 'file' not in request.files:
            return redirect(request.url)
        file = request.files['file']
        # 파일이 비어있는지 확인
        if file.filename == '':
            return redirect(request.url)
        # 파일이 허용된 확장자인지 확인
        if file and allowed_file(file.filename):
            # 파일명 중복을 피하기 위해 secure_filename을 사용하여 파일명 정규화
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return redirect(url_for('uploaded_file',
                                    filename=filename))
    return '''
    <!doctype html>
    <html>
    <body>
        <h1>파일 업로드</h1>
        <form method="post" enctype="multipart/form-data">
            <input type="file" name="file">
            <input type="submit" value="업로드">
        </form>
    </body>
    </html>
    '''

@app.route('/uploads/<filename>')
def uploaded_file(filename):
    return f'업로드한 파일: {filename}'

위의 코드는 /uploads 경로에 파일을 업로드하고, /uploads/<filename> 경로에서 업로드한 파일을 확인할 수 있도록 설정한 예제입니다.

3. 파일 다운로드 기능 구현하기

이번에는 파일을 다운로드하는 기능을 구현해보겠습니다.

from flask import Flask, send_from_directory

app = Flask(__name__)

# 다운로드할 파일이 저장된 폴더 설정
DOWNLOAD_FOLDER = './downloads'
app.config['DOWNLOAD_FOLDER'] = DOWNLOAD_FOLDER

@app.route('/downloads/<filename>')
def download_file(filename):
    return send_from_directory(app.config['DOWNLOAD_FOLDER'],
                               filename, as_attachment=True)

위의 코드는 /downloads/<filename> 경로에서 원하는 파일을 다운로드할 수 있도록 설정한 예제입니다. as_attachment=True를 통해 파일을 다운로드할 수 있게 설정합니다.

4. 실행해보기

위의 코드를 app.py라는 이름으로 저장한 후, 다음 명령을 사용하여 Flask 애플리케이션을 실행할 수 있습니다:

$ flask run

웹 브라우저에서 http://localhost:5000에 접속하여 파일 업로드 폼을 확인하고 파일을 업로드해보세요. 업로드한 파일은 uploads 폴더에 저장됩니다. 또한, http://localhost:5000/uploads/<filename> 경로를 통해 업로드한 파일을 확인할 수 있습니다.

또한 http://localhost:5000/downloads/<filename> 경로를 통해 원하는 파일을 다운로드할 수 있습니다. 다운로드한 파일은 downloads 폴더에 저장됩니다.

마무리

이번 포스트에서는 Flask를 이용하여 파일 업로드 및 다운로드 기능을 구현하는 방법을 알아보았습니다. Flask를 사용하면 간단하게 파일 업로드 및 다운로드 기능을 구현할 수 있으며, 이를 통해 웹 어플리케이션의 유용한 기능을 추가할 수 있습니다.