복붙노트

[PYTHON] 플라스크에 업로드 저장은 프로젝트 루트에만 저장됩니다.

PYTHON

플라스크에 업로드 저장은 프로젝트 루트에만 저장됩니다.

새 파일을 업로드하면 다른 UPLOAD_FOLDER를 지정했지만 응용 프로그램 루트 폴더에 저장됩니다. 구성이 작동하지 않는 이유는 무엇입니까?

views.py:

from flask import render_template
from flask import request, redirect, url_for,flash
from werkzeug.utils import secure_filename
from app import app
import os

APP_ROOT = os.path.dirname(os.path.abspath(__file__))
UPLOAD_FOLD = '/Users/blabla/Desktop/kenetelli/htmlfi'
UPLOAD_FOLDER = os.path.join(APP_ROOT, UPLOAD_FOLD)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

@app.route('/')
def tmrf():
    return render_template('main.html')


@app.route('/uploader', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['file']
        f.save(secure_filename(f.filename))
    return 'file uploaded successfully'

__init__.py:

from flask import Flask

UPLOAD_FOLDER = ''
ALLOWED_EXTENSIONS = set('*.doc')

app = Flask(__name__)
app.config.from_object('config')
from app import views

해결법

  1. ==============================

    1.UPLOAD_FOLDER은 Flask가 인식하는 구성 옵션이 아닙니다. f.save는 현재 작업 디렉토리 (일반적으로 개발 중에 프로젝트 루트)에 상대적으로 작동합니다.

    UPLOAD_FOLDER은 Flask가 인식하는 구성 옵션이 아닙니다. f.save는 현재 작업 디렉토리 (일반적으로 개발 중에 프로젝트 루트)에 상대적으로 작동합니다.

    보안 폴더 이름을 업로드 폴더에 결합한 다음 해당 경로에 저장하십시오.

    f.save(os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(f.filename)))
    

    프로젝트 루트가 아닌 인스턴스 폴더에 로컬 데이터를 저장하는 것이 좋습니다. 플라스크는 이미 그 위치를 알고 있습니다. 먼저 인스턴스 디렉토리를 작성하십시오.

    import os
    from werkzeug.utils import secure_filename
    
    # create the folders when setting up your app
    os.makedirs(os.path.join(app.instance_path, 'htmlfi'), exist_ok=True)
    
    # when saving the file
    f.save(os.path.join(app.instance_path, 'htmlfi', secure_filename(f.filename)))
    

    저장 위치에 관계없이 응용 프로그램을 실행하는 사용자에게 해당 디렉토리에 대한 쓰기 권한이 있는지 확인해야합니다. 예를 들어 mod_wsgi로 실행할 때 권한 오류가 발생하면 일반적으로 사용자는 httpd 또는 www-data입니다. 권한 거부 오류가 발생하면이를 확인하십시오.

  2. from https://stackoverflow.com/questions/42424853/saving-upload-in-flask-only-saves-to-project-root by cc-by-sa and MIT license