【问题标题】:CS50 final project: Problem with upload file pathCS50 最终项目:上传文件路径有问题
【发布时间】:2018-12-09 00:34:19
【问题描述】:

这里是业余程序员和爱好者,第一次问...我正在处理 CS50 课程的最后一个项目。我正在建立一个网站,您可以在其中注册和上传某些文件。一切似乎都运行良好,但当我尝试上传文档时,我收到内部服务器错误并显示以下消息:

服务器遇到内部错误,无法完成您的请求。要么服务器过载,要么应用程序出错。

发生了什么事?将文档上传到 CS50 IDE 中的文件夹是否有限制?我似乎无法找到解决此问题的方法。文档必须是 PDF 格式,我尝试过 /documentos、/fp/documentos 和 ~/workspace/fp/documentos/ 作为文件路径。代码如下:

import os

from cs50 import SQL
from flask import Flask, flash, redirect, render_template, request, session, 
url_for
from flask_session import Session
from tempfile import mkdtemp
from werkzeug.exceptions import default_exceptions
from werkzeug.security import check_password_hash, generate_password_hash
from werkzeug.utils import secure_filename

from helpersp import apology, login_required

# Define uploaded documents destination and allowed extensions

UPLOAD_FOLDER = '/fp/documentos/' 
ALLOWED_EXTENSIONS = set(['pdf'])

# Check if extension is allowed.

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route("/primer", methods=["GET", "POST"])
@login_required
def primer():
"""Prompts user to upload pre contractual documents"""
 if request.method == "GET":
     return render_template("primer.html")

 else:
     # check if the post request has the file part
     if "file" not in request.files:
         return render_template("sindocumentos.html")
     file = request.files["file"]
     #  if user does not select file, browser also
     # submit an empty part without filename
     if file.filename == "":
         return render_template("sindocumentos.html")
     if file and allowed_file(file.filename):
         filename = secure_filename(file.filename)
         file.save(os.path.join(app.config['/fp/documentos/'], filename))

     return render_template("successp.html")

这是 HTML 部分:

{% extends "layoutp.html" %}

{% block title %}
    Subir carpeta
{% endblock %}

{% block main %}
    <form action="/primer" method="post" enctype=multipart/form-data>
        <div>
            Sube tu carpeta de documentos en un solo archivo PDF.
        </div>
        <div>
            El nombre del archivo debe tener el siguiente formato: 
           carpeta_nombre_apellido_año.pdf.
        </div>
        <div class="form-group">
           <input type="file" name="file">
        </div>
        <button class="btn btn-primary" type="submit">Subir</button>
    </form>
{% endblock %}

烧瓶跟踪如下:

ERROR:flask.app:Exception on /primer [POST]
Traceback (most recent call last):
  File "/opt/pyenv/versions/3.6.0/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/opt/pyenv/versions/3.6.0/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/opt/pyenv/versions/3.6.0/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/opt/pyenv/versions/3.6.0/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/opt/pyenv/versions/3.6.0/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/opt/pyenv/versions/3.6.0/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/ubuntu/workspace/fp/helpersp.py", line 34, in decorated_function
    return f(*args, **kwargs)
  File "/home/ubuntu/workspace/fp/profesores.py", line 133, in primer
    file.save(os.path.join(app.config[UPLOAD_FOLDER], filename))
KeyError: '/documentos'

更新:我尝试了不同的绝对路径,但没有任何运气。我试过使用 os.path.abspath(os.path.dirname(file)) 和 UPLOAD_FOLDER=os.mkdir('documentos2')。使用 os.mkdir 选项,它给了我与以前相同的错误消息,只有这种类型的 KeyError 是“无”:

 File "/opt/pyenv/versions/3.6.0/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/ubuntu/workspace/fp/helpersp.py", line 34, in decorated_function
    return f(*args, **kwargs)
  File "/home/ubuntu/workspace/fp/profesores.py", line 124, in primer
    file.save(os.path.join(app.config[UPLOAD_FOLDER], filename))
KeyError: None

非常感谢任何帮助!

【问题讨论】:

    标签: python flask cs50


    【解决方案1】:

    试试这样的:

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

    而不是

    file.save(os.path.join(app.config['/fp/documentos/'], filename))
    

    不确定这是否能解决您的问题,但这是我的工作文件的样子,我使用与您相同的属性。这是我能找到的唯一不同的地方。它也可能是路径,您确定在您的代码中定义了完整路径,并且您在执行发布请求时是否看到在该路径中上传的任何文件?

    完整路径示例:

    /Users/username/Desktop/csv_tool/upload_folder
    

    【讨论】:

      猜你喜欢
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      相关资源
      最近更新 更多