web-dev-qa-db-ja.com

Flaskファイルのダウンロード

Flaskを使用して、ユーザーがファイルをアップロードして別のユーザーに提供できるようにするWebアプリを作成しようとしています。現在、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を手動で入力した場合は、スペルを確認してもう一度お試しください。

ファイル名をオブジェクトにリンクし、ユーザーにダウンロードさせたいだけです(同じビュー内のすべてのオブジェクトに対して)

35
Saimu

directory引数に渡す値が絶対パスであり、アプリケーションのcurrentの場所が修正されていることを確認する必要があります。

これを行う最良の方法は、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が相対的でなければならないことを繰り返し述べることが重要です。 /で始まっていません。

相対パスcould動作しますが、Flaskコードが存在する場所に設定されている現在の作業ディレクトリに依存しすぎます。これは常に当てはまるわけではありません。

42
Martijn Pieters

flask call。)でファイルをダウンロードするにはファイル名は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 __== '__main__':
    app.run(port=5000,debug=True) 
7
Viraj.Hadoop

私も同様のアプリケーションを開発していました。また、ファイルが存在していてもエラーが見つかりませんでした。これで問題が解決します。 「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>
3
Waqar Detho