【问题标题】:Upload image in Flask在 Flask 中上传图片
【发布时间】:2017-12-09 03:16:19
【问题描述】:

我必须在我的项目目录的静态文件夹中上传一些图像,但我不知道如何对我的代码说。在下面的 code.py 中,我可以上传图像并将其存储在静态文件夹同一级别的项目目录中,但我希望该图像可以存储在静态文件夹中。

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

      f.save(secure_filename(f.filename))
      return render_template('end.html')

我该怎么办??谢谢大家

【问题讨论】:

  • 如果你能接受一个答案作为正确答案就好了

标签: python flask image-uploading


【解决方案1】:

你需要定义upload folder

来自flask 文档

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

UPLOAD_FOLDER = '/path/to/the/uploads'
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

def upload_file():
    if request.method == 'POST':
        # check if the post request has the file part
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        # if user does not select file, browser also
        # submit a empty part without filename
        if file.filename == '':
            flash('No selected file')
            return redirect(request.url)
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

https://flask.palletsprojects.com/en/1.1.x/patterns/fileuploads/

所以你的代码是UPLOAD_FOLDER = '/path/to/static/images' 或类似的东西

【讨论】:

  • 这和链接对实现实施非常有帮助。谢谢
  • 这仅适用于您只想上传一张图片的情况。如果用户选择 2 个或更多图像,则只会上传第一个文件。怎么可能同时上传2张以上的图片?
  • @FrancoGil 通过 javascript/html 将几个文件传递给烧瓶,然后使用 for 循环遍历它们。如果我没记错的话,您可以指定允许多个文件因此循环
  • 谢谢@DavidFrick,我忘了确认我找到了解决这个小问题的方法。
  • def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
【解决方案2】:
  1. 您的表单的enctype 应该是multipart/form-data(否则不起作用):
<form method="post" enctype="multipart/form-data">
...
</form>
  1. 你应该指定上传文件夹(否则不起作用):

app.config['UPLOAD_FOLDER'] = '/path/to/the/uploads'

  1. 您应该为您的文件输入指定一个名称(否则它不起作用):
<input type="file" name="file1">
  1. 您应该使用文件save() 方法手动保存文件:
path = os.path.join(app.config['UPLOAD_FOLDER'], file1.filename)
file1.save(path)
  1. 简单的完整示例:
import os
from flask import Flask, request

UPLOAD_FOLDER = './upload'

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        if 'file1' not in request.files:
            return 'there is no file1 in form!'
        file1 = request.files['file1']
        path = os.path.join(app.config['UPLOAD_FOLDER'], file1.filename)
        file1.save(path)
        return path

        return 'ok'
    return '''
    <h1>Upload new File</h1>
    <form method="post" enctype="multipart/form-data">
      <input type="file" name="file1">
      <input type="submit">
    </form>
    '''

if __name__ == '__main__':
    app.run()
  1. 详细的完整示例: https://flask.palletsprojects.com/en/1.1.x/patterns/fileuploads/

【讨论】:

    【解决方案3】:

    尝试先将图像 jpeg 或 jpg 存储在静态文件夹中 在静态文件夹中存储图像

    然后在html文件中

    <img src="{{url_for('static', filename='Hermes.png')}}" align="middle" />
    

    添加此代码行

    在 app.py 中的代码

    from flask import Flask, render_template, redirect, url_for, request
    
    
    # Route for handling the login page logic
    app = Flask(__name__)
    
    
    @app.route('/', methods=['GET', 'POST'])
    def home():
        return render_template('home.html')
    
    @app.route('/register')
    def register():
        return render_template('register.html')
    
    @app.route('/registerV')
    def registerV():
        return render_template('registerV.html')
    

    在 register.html 中的代码

    <html>
        <head>
        </head>
    
        <body>
        <div class="bd-example" align="middle">
                <img src="{{url_for('static', filename='Hermes.png')}}" align="middle" />
                </div>
        </body>
    </html>
    

    【讨论】:

      【解决方案4】:

      enctype="multipart/form-data" 添加到包含您的input type=file 的表单中 之后,

      from os.path import join, dirname, realpath
      from werkzeug.utils import secure_filename
      
      UPLOADS_PATH = join(dirname(realpath(__file__)), 'static\\img')
      
              
      
      if request.files['image'].filename != '':
                      image = request.files['image']
                      image.save(os.path.join(UPLOADS_PATH, secure_filename(image.filename)))
      

      【讨论】:

        【解决方案5】:

        由于某种原因,@PYA 的代码对我不起作用,但我做了一个小改动:
        我使用'path/to/the/uploads' 而不是'/path/to/the/uploads',一切正常。

        【讨论】:

          猜你喜欢
          • 2020-12-19
          • 2015-05-13
          • 1970-01-01
          • 1970-01-01
          • 2020-12-30
          • 2021-11-15
          • 1970-01-01
          • 2020-12-09
          • 2022-01-17
          相关资源
          最近更新 更多