Флажок Загрузить файл

Я пытаюсь создать веб-приложение с Flask, которое позволяет пользователю загружать файл и обслуживать его другому пользователю. Сейчас я могу загрузить файл в папку upload_folder правильно. Но я не могу найти способ позволить пользователю загрузить его обратно.

Я храню имя файла в базе данных.

У меня есть представление, обслуживающее объекты базы данных. Я также могу удалить их.

@app.route('/dashboard', methods=['GET', 'POST'])
def dashboard():

    problemes = Probleme.query.all()

    if 'user' not in session:
        return redirect(url_for('login'))

    if request.method == 'POST':
        delete = Probleme.query.filter_by(id=request.form['del_button']).first()
        db.session.delete(delete)
        db.session.commit()
        return redirect(url_for('dashboard'))

    return render_template('dashboard.html', problemes=problemes)

В моем HTML я:

<td><a href="{{ url_for('download', filename=probleme.facture) }}">Facture</a></td>

и вид загрузки:

@app.route('/uploads/<path:filename>', methods=['GET', 'POST'])
def download(filename):
    return send_from_directory(directory=app.config['UPLOAD_FOLDER'], filename=filename)

Но он возвращается:

Не найдено

Запрошенный URL-адрес не найден на сервере. Если вы указали URL вручную, проверьте правильность написания и повторите попытку.

Я просто хочу связать имя файла с объектом и позволить пользователю его загрузить (для каждого объекта в том же представлении)

Ответы

Ответ 1

Вам нужно убедиться, что значение, которое вы передаете аргументу directory, является абсолютным путем, скорректированным для текущего местоположения вашего приложения.

Лучший способ сделать это - настроить UPLOAD_FOLDER как относительный путь (без ведущей косой черты), а затем сделать его абсолютным, добавив current_app.root_path:

@app.route('/uploads/<path:filename>', methods=['GET', 'POST'])
def download(filename):
    uploads = os.path.join(current_app.root_path, app.config['UPLOAD_FOLDER'])
    return send_from_directory(directory=uploads, filename=filename)

Важно повторить, что UPLOAD_FOLDER должен относиться к этому, чтобы это работало, например. не начинайте с /.

Относительный путь может работать, но слишком сильно зависит от текущего рабочего каталога, установленного в том месте, где живет ваш код фляжки. Это может быть не всегда так.

Ответ 2

  Чтобы загрузить файл в колбу, позвоните. Имя файла: examples.pdf. Когда я нажимаю 127.0.0.1:5000/download, он должен получить скачать.

Пример:

from flask import Flask
from flask import send_file
app = Flask(__name__)

@app.route('/download')
def downloadFile ():
    #For windows you need to use drive name [ex: F:/Example.pdf]
    path = "/Examples.pdf"
    return send_file(path, as_attachment=True)

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

Ответ 3

Я также разрабатывал подобное приложение. Я также получал ошибку, даже несмотря на то, что файл был там. Это решает мою проблему. Я упоминаю папку для загрузки в "static_folder":

app = Flask(__name__,static_folder='pdf')

Мой код для загрузки выглядит следующим образом:

@app.route('/pdf/<path:filename>', methods=['GET', 'POST'])
def download(filename):    
    return send_from_directory(directory='pdf', filename=filename)

Вот как я вызываю свой файл из html.

<a class="label label-primary" href=/pdf/{{  post.hashVal }}.pdf target="_blank"  style="margin-right: 5px;">Download pdf </a>
<a class="label label-primary" href=/pdf/{{  post.hashVal }}.png target="_blank"  style="margin-right: 5px;">Download png </a>