Flask загружает файл

#python #flask #download #flask-sqlalchemy

#python #flask #Скачать #flask-sqlalchemy

Вопрос:

Я пытаюсь создать веб-приложение с помощью 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. Для какого URL Flask возвращает ответ 404 Not Found? Вы убедились, что рассматриваемое имя файла действительно находится в app.config['UPLOAD_FOLDER'] ?

2. Это так, потому что у меня есть формы загрузки, которые действительно загружали файл. Я просто не могу его загрузить. Загрузка в папку выполняется нормально. URL: 127.0.0.1:5000/uploads/rsc_chapitre17.pdf и файл действительно там!

3. Причина, по которой я спрашиваю, заключается в том, что send_from_directory() вызовет NotFound , когда там нет файла. Поэтому os.path.isfile(app.config['UPLOAD_FOLDER']/filename) вернул false . Вам нужно дважды проверить содержимое UPLOAD_FOLDER и убедиться, что имя файла, которое вы пытаетесь загрузить, действительно существует.

4. Он есть, изменил app = Flask ( имя ) на app = Flask ( name , static_folder=’uploads’) и по некоторым причинам это сработало.

5. Python отлично справляется с завершающей косой чертой. Проблема здесь в ведущей косой черте. Вы определили абсолютный путь, а не относительный.

Ответ №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 должно быть относительным, чтобы это работало, например, не начинаться с / .

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

Ответ №2:

Чтобы загрузить файл, вызовите flask.Имя файла — 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) 
  

Комментарии:

1. На самом деле это не решает вопрос, который использует переменный элемент path для присвоения имени файлу для загрузки.

2. Это не имеет значения. на вопрос с высоким рейтингом SEO общим заголовком Flask Download a File следует ответить более обобщенно, специально IMO

3. Удивительно просто. Именно то, что мне было нужно. Спасибо!

Ответ №3:

Я также разрабатывал похожее приложение. Я также получал ошибку not found, хотя файл был там. Это решает мою проблему. Я упоминаю свою папку загрузки в ‘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>
  

Комментарии:

1. Вам не нужно или даже хотите также указывать static_folder на свой подкаталог pdf. Это просто означает, что все из /static/ пути также передается из pdf вложенной папки. И, как я уже говорил в своем ответе: Относительный путь мог работать, но слишком сильно зависит от того, что текущий рабочий каталог устанавливается в то место, где находится ваш код Flask. ; ваш относительный путь в directory='pdf' тоже попадет в эту ловушку.

Ответ №4:

 #HTML Code
 
<ul>
 {% for file in files %}
  <li> <a href="{{ url_for('download', filename=file) }}">{{ file }}</a></li>
 {% endfor %}
</ul>


#Python Code

from flask import send_from_directory

app.config['UPLOAD_FOLDER']='logs'


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