#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
следует ответить более обобщенно, специально IMO3. Удивительно просто. Именно то, что мне было нужно. Спасибо!
Ответ №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/
пути также передается из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)