【问题标题】:Internal Server Error when uploading a file using Flask使用 Flask 上传文件时出现内部服务器错误
【发布时间】:2020-07-27 18:25:58
【问题描述】:

我正在使用 CS50 IDE 和 Flask 开发一个 Web 应用程序。我希望用户上传带有表单的文件。但是当表单提交时,我得到一个“500 Internal Server Error”,无论文件是否被选中。

如果选择了文件,则控制台中没有错误日志。

如果选择NO文件,有如下错误日志:

ERROR:application:Exception on /new-item [POST]
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/ubuntu/final-project/helpers.py", line 34, in decorated_function
    return f(*args, **kwargs)
  File "/home/ubuntu/final-project/application.py", line 45, in decorated_function
    return f(*args, **kwargs)
  File "/home/ubuntu/final-project/application.py", line 350, in newItem
    file.save(os.path.join(app.config['IMAGE_UPLOADS'], filename))
  File "/usr/local/lib/python3.7/site-packages/werkzeug/datastructures.py", line 2800, in save
    dst = open(dst, "wb")
IsADirectoryError: [Errno 21] Is a directory: 'static/img/menu/'

烧瓶代码

app.config["IMAGE_UPLOADS"] = "static/img/menu/"

@app.route("/new-item", methods=['GET', 'POST'])
def newItem():
    if request.method == "POST":

        if request.files:
            file = request.files["file"]
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['IMAGE_UPLOADS'], filename))

HTML 代码

<form action="/new-item" method="post" enctype="multipart/form-data">
    <div>
        <input type="file" name="file">
        <label>Choose Image</label>
    </div>
    <button type="submit">Submit</button>
</form>

知道是什么导致了错误吗?

【问题讨论】:

  • 选择文件时的堆栈跟踪是什么?
  • 选择文件时的回溯中没有任何内容。不过,我确实从 nginx 得到了 500。

标签: flask cs50


【解决方案1】:

你需要去掉尾部斜杠,这是对os.path.join的误用

app.config["IMAGE_UPLOADS"] = "static/img/menu" # drop the trailing slash

见Why doesn't os.path.join() work in this case?

您可能还需要将app.config["IMAGE_UPLOADS"] 更新为绝对路径而不是相对路径。

【讨论】:

  • 我已经删除了斜杠并用“os.getcwd()+'/static/img/menu'”替换了路径。 Traceback: IsADirectoryError: [Errno 21] 是目录:'/home/ubuntu/final-project/static/img/menu/'
  • 好的,这一定是没有选择文件时的错误。当没有选择文件时,您需要添加处理,例如if not filename: return # do nothing and keep the user on the same page,或向用户显示错误消息。选择文件时会发生什么?
  • 选择文件后,我在控制台中没有得到任何回溯。不过,我在浏览器中确实收到了来自 nginx 的 500 响应。仅供参考,我在“最终项目”目录中运行 Flask。
  • 文件真的上传了吗?它在你的目录中吗?我认为nginx与这个问题无关
  • 否,该文件未上传且目录中不存在。
猜你喜欢
  • 1970-01-01
  • 2016-12-28
  • 2013-08-10
  • 2017-07-23
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2012-05-01
相关资源
最近更新 更多