4

ユーザーが次のようなリンクをクリックできるようにしたいと思います。

<a href="/download?file=123">download</a>

Pyramid1.2.7アプリにこのようなビューを処理させる

@view_config(route_name='download')
def download(request):
    file_id = request.GET['file']
    filename = get_filename(file_id)
    headers = request.response.headers
    headers['Content-Description'] = 'File Transfer'
    headers['Content-Type'] = 'application/force-download'
    headers['Accept-Ranges'] = 'bytes'
    headers['X-Accel-Redirect'] = ("/path/" + filename + ".pdf")
    return request.response

そして私のnginx構成は次のようになります

location /path/ {
 internal;
 root /opt/tmp; 
}

これはすべて機能しますが、ブラウザにPDFがダウンロードされていることを表示する代わりに、ブラウザに大量のPDFガベージが表示されます。

ブラウザに正しい動作をさせるためにピラミッドビューを設定するにはどうすればよいですか?

4

1 に答える 1

7

Web ブラウザーがリソースを表示するのではなくダウンロードする必要があることを示したい場合は、RFC 6266 で説明されているようにContent-Dispositionヘッダーを使用してみてください。たとえば、次の応答ヘッダーは、ブラウザーにファイルをダウンロードするように指示します。

Content-Disposition: attachment

このヘッダーを使用して、ダウンロードしたファイルのファイル名を指定することもできます (URL の最後のパス コンポーネントと異なる場合)。

Content-Disposition: attachment; filename=foo.pdf

Nginx のドキュメントを見ると、この応答ヘッダーは、X-Accel-Redirect使用している機能と連動して正しく動作するはずです。

于 2012-10-19T05:26:36.850 に答える