Загрузка файла в приложение flask дает ошибку NotADirectoryError: [Ошибка 20] Не каталог

#python #html #azure #flask

Вопрос:

Он там, я уже 2 дня пытаюсь найти решение своей проблемы, но до сих пор ничего не нашел. Может быть, просто не хватает этого. Мое веб-приложение flask запущено в Microsoft azure. Ошибка очень простая, дискреционная, не найдена, но я не знаю, как найти правильный путь.

Я получаю следующую ошибку:

 Traceback (most recent call last):
  File "/usr/local/lib/python3.8/dist-packages/flask/app.py", line 2069, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python3.8/dist-packages/flask/app.py", line 2054, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/local/lib/python3.8/dist-packages/flask/app.py", line 2051, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.8/dist-packages/flask/app.py", line 1501, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.8/dist-packages/flask/app.py", line 1499, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.8/dist-packages/flask/app.py", line 1485, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "/home/ivar/PycharmProjects/Course8.1/app.py", line 78, in genpanel
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
  File "/usr/local/lib/python3.8/dist-packages/werkzeug/datastructures.py", line 3013, in save
    dst = open(dst, "wb")
FileNotFoundError: [Errno 2] No such file or directory: '/uploads/GenPanelOverzicht_DG-3.1.0_HAN.xlsx'
 

У меня есть следующий код колбы:

 import os

from flask import Flask, render_template, request
from werkzeug.utils import secure_filename

UPLOAD_FOLDER = '/uploads'
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
FLASK_DEBUG=1
@app.route('/')
def home():
    """ home page """
    return render_template("basis.html")
@app.route('/genpanel', methods=['GET', 'POST'])
def genpanel():
    """ genpanel upload page """
    print(os.getcwd())
    try:
        if request.method == 'POST':
            f = request.files['file']
            filename = secure_filename(f.filename)
            f.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            md5sum, dictionary = Genpanelanalyser.fileopener(
                '/uploads/' f.filename)
            md5sumold = Genpanelanalyser.getmd5sum()
            if md5sum != md5sumold:
                Genpanelanalyser.database(md5sum, dictionary)
                message = "File upload was successfull"
                os.remove('/uploads/'   f.filename)
                return render_template("genpanel.html", message=message)
            else:
                message = "Data allready exists"
                os.remove('/uploads/' f.filename)
                return render_template("genpanel.html", message=message)
        else:
            message = "Upload a file"
            return render_template("genpanel.html", message=message)
    except FileExistsError or FileNotFoundError:
        message = "File not found"
        return render_template("genpanel.html", message=message)


if __name__ == '__main__':
    app.run(debug=True)
 

Это мой html-код:

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="Danielle Dunnewold, Ivar van den Akker en Moshtach
    Ismail" >
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Manual</title>
    <link rel="stylesheet" href="static/Style.css">
</head>
<body>
    <!-- horizontaal menu -->
    <div class="scrollmenu">
        <a href="/">HOME</a>
        <a href="/results">APPLICATION</a>
        <a href="/manual">MANUAL</a>
        <a href="/download">DOWNLOAD RESULTS</a>
        <a href="/genpanel">UPLOAD GENEPANEL</a>
    </div>
<H2>Upload a new genepanel</H2>
    <form action = '/genpanel' method = "POST" enctype = "multipart/form-data">
         <input type = "file" name = "file" />
         <input type = "submit" value = "Submit" />
    </form>
    <br>
    <p>{{ message }}</p>
</body>
</html>
 

Если кто-то знает решение или страницу, где я могу найти решение или способ найти решение, не стесняйтесь комментировать и помогать мне. Если потребуется дополнительная информация, я могу ее предоставить.

Ответ №1:

папка загрузки определена как app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER , но похоже, что она существует, поэтому строка кода f.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) выходит из строя. вы можете попробовать

  1. создайте папку «загрузки», и она будет на том же уровне, что и шаблоны.
  2. os.remove будет выглядеть так, как показано ниже(удалите первый /)
 os.remove('uploads/'   f.filename)
 

Ответ №2:

Я создал функцию, чтобы получить путь к папке загрузки и передать его своей функции, чтобы путь всегда был правильным. Я попытался создать папку, но на самом деле это не сработало. Вы где правы насчет /.

функция для получения пути:

 import  os
def getpath():
    patht = os.getcwd()
    path = patht "/uploads/"
    return path
 

Новая функция в app.py:

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


@app.route('/')
def home():
    """ home page """
    return render_template("basis.html")
@app.route('/genpanel', methods=['GET', 'POST'])
def genpanel():
    """ genpanel upload page """
    try:
        if request.method == 'POST':
            f = request.files['file']
            filename = secure_filename(f.filename)
            f.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            md5sum, dictionary = Genpanelanalyser.fileopener(
                UPLOAD_FOLDER f.filename)
            md5sumold = Genpanelanalyser.getmd5sum()
            if md5sum != md5sumold:
                Genpanelanalyser.database(md5sum, dictionary)
                message = "File upload was successfull"
                os.remove(UPLOAD_FOLDER f.filename)
                return render_template("genpanel.html", message=message)
            else:
                message = "Data allready exists"
                os.remove(UPLOAD_FOLDER f.filename)
                return render_template("genpanel.html", message=message)
        else:
            message = "Upload a file"
            return render_template("genpanel.html", message=message)
    except FileExistsError or FileNotFoundError:
        message = "File not found"
        return render_template("genpanel.html", message=message)


if __name__ == '__main__':
    app.run()