如何在Python框架Flask中将图像文件从表单上传到数据库

问题描述 投票:-1回答:1

我正在尝试将一个表单中的图像从Flask上传到我正在处理的练习电子商务网站中的数据库。我正在使用flask-uploads来处理文件上传,因为它似乎比其他上传文件的方式更容易。我收到以下错误“NameError:名称'图像'未定义”。这个错误似乎发生在routes.py文件中,该文件处理网站的功能和路由。我将列出下面代码的主要部分。 routes.py文件中的add_item函数获取表单提交的内容并将该数据发送到数据库。正如我所说,这是错误发生的地方,因为无法识别图像,但我无法弄清楚如何解决问题。 Init.py是一个包,用于保存flask-uploads连接的位置。 Config.py用于定义应用程序的配置。 forms.py文件中的addItem函数用于布局表单的结构。由于我不认为它与问题相关联,因此本文档中未包含的HTML文件使用forms.py中的表单结构将表单显示在屏幕上。

我已经尝试在线查找解决方案,但是没有非常详细的解决方案来解决这个问题,而且Python Flask的文档已经足够有限,但Flask-Upload没有很好的文档,特别是没有关于与数据库一起使用的文档。我是Python Flask的新手,所以如果有人能帮我解决这个问题,我将不胜感激。

routes.朋友:

    #addItem page
    @app.route('/add_Item',methods=["GET","POST"])
    add_Item():
             form = addItem()
             if form.validate_on_submit():
                 filename = images.save(request.files['image'])
                 url = images.url(filename)
                 item = Item(title=form.name.data,price=form.price.data,description=form.description.data,stock=form.stock.data,vendorid=current_user.id,image=url)
                 db.session.add(item)
                 db.session.commit()
                 flash("Congratulations, your item has been added")
                 return redirect(url_for('vendor',username=current_user.username))
              else:
                 return render_template('addItem.html', title="Add Item", form=form)

init.朋友:

    from flask import Flask
    from config import Config
    from flask_sqlalchemy import SQLAlchemy
    from flask_migrate import Migrate
    from flask_login import LoginManager
    from flask_uploads import UploadSet, IMAGES, configure_uploads

    app = Flask(__name__)
    app.config.from_object(Config)
    db = SQLAlchemy(app)
    migrate = Migrate(app, db)
    login = LoginManager(app)

    # Configure the image uploading via Flask-Uploads
    images = UploadSet('images', IMAGES)
    configure_uploads(app, images)

    from app import routes, models, errors

config.朋友

    import os
    basedir = os.path.abspath(os.path.dirname(__file__))
    TOP_LEVEL_DIR = os.path.abspath(os.curdir)

   class Config(object):
      SECRET_KEY = os.environ.get('SECRET_KEY') or 'abcdef'
      SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
         'sqlite:///' + os.path.join(basedir, 'app.db')
      SQLALCHEMY_TRACK_MODIFICATIONS = False
      UPLOADS_DEFAULT_DEST = TOP_LEVEL_DIR + '/app/static/img/'
      UPLOADS_DEFAULT_URL = 'http://localhost:5000/static/img/'
      UPLOADED_IMAGES_DEST = TOP_LEVEL_DIR + '/app/static/img/'
      UPLOADED_IMAGES_URL = 'http://localhost:5000/static/img/'

forms.朋友

      class addItem(FlaskForm):
        name = StringField('Name',validators=[DataRequired()])
        price = IntegerField('Price',validators=[DataRequired()])
        description = StringField('Description',validators=[DataRequired()])
        stock = IntegerField('Stock',validators=[DataRequired()])
        image = FileField('Image', validators=[FileRequired(), FileAllowed(images, 'Images only!')])
        submit = SubmitField('Submit',validators=[DataRequired()])
python database flask flask-uploads
1个回答
1
投票

试试这个

         f = request.files['image']
         f.save(secure_filename(f.filename))
         url = f.filename

在这里,您可以看到我对您的文件名使用了secured_filename()。这是为了防止目录横向攻击。

url是文件名,图像将保存在与应用程序代码相同的目录中。

最后,您的代码如下所示

#addItem page
    @app.route('/add_Item',methods=["GET","POST"])
    add_Item():
             form = addItem()
             if form.validate_on_submit():

                 f = request.files['image']
                 f.save(secure_filename(f.filename))
                 url = f.filename
                 item = Item(title=form.name.data,price=form.price.data,description=form.description.data,stock=form.stock.data,vendorid=current_user.id,image=url)
                 db.session.add(item)
                 db.session.commit()
                 flash("Congratulations, your item has been added")
                 return redirect(url_for('vendor',username=current_user.username))
              else:
                 return render_template('addItem.html', title="Add Item", form=form)

为了更高级的文件上传安全性。然后读了link

© www.soinside.com 2019 - 2024. All rights reserved.