【问题标题】:Saving an uploaded file to disk doesn't work in Flask [duplicate]将上传的文件保存到磁盘在 Flask 中不起作用 [重复]
【发布时间】:2017-10-17 14:12:08
【问题描述】:

我想将任何上传的图像存储到名为“logo.png”的静态/自定义徽标文件夹中,无论其实际名称是什么。我有一个带有典型静态和模板文件夹的基本 Flask 设置。为简单起见,我在下面的代码中删除了扩展验证等内容。但是,这样做会引发 FileNotFound 错误。由于我想在各种环境中运行我的应用程序,我不想使用静态路径。我究竟做错了什么?感谢您的帮助。

latestfile = request.files['customlogo']
#This prints the file name of the uploaded file
print(latestfile.filename)
#I want to save the uploaded file as logo.png. No matter what the uploaded file name was.
latestfile.save(os.path.join('/static/customlogos', 'logo.png'))

【问题讨论】:

  • 路径/static/customlogos 指的是文件系统上的一个目录。在这种情况下,这段代码尝试保存文件的路径是/static/customlogos/logo.png
  • 你创建了/static/customlogos/ 吗?我也有同样的错误,我的问题是忘记创建文件夹
  • 另外值得注意的是,如果文件实际上不是 PNG 文件,您将像这样重命名文件可能会导致一些问题。
  • 上传的文件是png格式的图片。将上传的文件重命名为 logo.png 会解决问题吗?
  • 我很确定 /static/customlogos 文件夹不存在于您的文件系统中。尝试将其替换为 /tmp 并查看结果。

标签: python python-3.x flask


【解决方案1】:

显然,您希望将上传的文件保存为static/customlogos/logo.png,这是相对于您的 Flask 应用程序目录的路径,但您指定了绝对不存在的路径 /static/customlogos
此外,根据您在 Windows 下开发的 cmets,这会增加您的问题的不一致。

无论如何,要实现你想要的,你需要知道你的应用程序的绝对路径,并以此为起点:

latestfile.save(os.path.join(app.root_path, 'static/customlogos/logo.png'))

跨平台变体:

latestfile.save(os.path.join(app.root_path, 'static', 'customlogos', 'logo.png'))

忍者防尘变体:

latestfile.save(os.path.join(app.root_path, app.config['STATIC_FOLDER'], 'customlogos', 'logo.png'))

【讨论】:

  • 在我的情况下,它被保存为空而不是原始内容
【解决方案2】:

您可以简化如下操作:

from flask import Flask, request, session, g, redirect
from flask import url_for, abort, render_template, flash, jsonify
import os

# Create two constant. They direct to the app root folder and logo upload folder
APP_ROOT = os.path.dirname(os.path.abspath(__file__))
UPLOAD_FOLDER = os.path.join(APP_ROOT, 'static', 'customlogos')

# Configure Flask app and the logo upload folder
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

# In controller save the file with desired name
latestfile = request.files['customlogo']
full_filename = os.path.join(app.config['UPLOAD_FOLDER'], 'logo.png')
latestfile.save(full_filename)

注意:确保您已在 static 文件夹中创建了 customlogos

【讨论】:

    猜你喜欢
    • 2018-09-14
    • 1970-01-01
    • 2013-12-26
    • 2011-06-27
    • 2011-03-26
    • 2016-07-22
    • 2013-12-19
    • 2010-09-23
    • 2010-11-08
    相关资源
    最近更新 更多