【问题标题】:Saving upload in Flask only saves to project root在 Flask 中保存上传仅保存到项目根目录
【发布时间】:2017-07-14 11:19:18
【问题描述】:

当我上传一个新文件时,它会保存到应用程序根文件夹,即使我指定了不同的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

【问题讨论】:

    标签: python flask


    【解决方案1】:

    UPLOAD_FOLDER 不是 Flask 识别的配置选项。 f.save 相对于当前工作目录工作,通常是开发期间的项目根目录。

    将受保护的文件名加入上传文件夹,然后保存到该路径。

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

    最好将本地数据存储在instance folder,而不是项目根目录。 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 运行时遇到权限错误,例如,用户通常是 httpdwww-data。如果您收到权限被拒绝错误,请检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 2014-04-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多