簡體   English   中英

Flask 下載文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM