[英]Flask Download a File
我正在嘗試使用 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,請檢查您的拼寫並重試。
我只想將文件名鏈接到對象並讓用戶下載它(對於同一視圖中的每個對象)
您需要確保傳遞給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 代碼所在的位置。 情況可能並非總是如此。
在燒瓶調用上下載文件。 文件名是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)
我也在開發一個類似的應用程序。 即使文件在那里,我也沒有找到錯誤。 這解決了我的問題。 我在“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>
#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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.