Flaskでアップロードを保存すると、プロジェクトルートにのみ保存されます 質問する

Flaskでアップロードを保存すると、プロジェクトルートにのみ保存されます 質問する

新しいファイルをアップロードすると、別の を指定したにもかかわらず、アプリケーション ルート フォルダーに保存されます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

UPLOAD_FOLDERFlask によって認識される構成オプションではありません。f.save現在の作業ディレクトリ (通常は開発中のプロジェクト ルート) を基準にして動作します。

保護されたファイル名をアップロード フォルダーに結合し、そのパスに保存します。

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

ローカルデータをインスタンスフォルダ、プロジェクト ルートではありません。Flask はすでにその場所を知っています。instance最初にディレクトリを作成するようにしてください。

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。権限が拒否されたエラーが発生した場合は、それを確認してください。

おすすめ記事