10

私は Django で画像バンクを作成しています。画像の高解像度バージョンを取得するためのボタンを追加したいと考えています (低解像度は詳細ページに表示されます)。<a>リンクだけを配置すると、ブラウザーは画像をダウンロードする代わりに画像を開きます。次のような HTTP ヘッダーを追加します。

Content-Disposition: attachment; filename="beach008.jpg"

動作しますが、静的ファイルなので、Django でリクエストを処理したくありません。現在、NGINX を使用して静的ファイルを提供しており、動的ページは FastCGI 経由で Django プロセスにリダイレクトされます。add-headerNGINXコマンドを使おうと思っているのですが、filename="xx"パーツの設定はできますか?それとも、Django でリクエストを処理する方法があるかもしれませんが、NGINX にコンテンツを提供させますか?

4

3 に答える 3

10

django アプリが nginx によってプロキシされている場合は、x-accell-redirectを使用できます。応答で特別なヘッダーを渡す必要があります。nginx はこれをインターセプトしてファイルの提供を開始します。同じ応答で Content-Disposition を渡してダウンロードを強制することもできます。

このソリューションは、これらのファイルにアクセスするユーザーを制御したい場合に適しています。

次のような構成を使用することもできます。

    #files which need to be forced downloads
    location /static/high_res/ {
        root /project_root;

        #don't ever send $request_filename in your response, it will expose your dir struct, use a quick regex hack to find just the filename
        if ($request_filename ~* ^.*?/([^/]*?)$) {
            set $filename $1;
        }

        #match images
        if ($filename ~* ^.*?\.((jpg)|(png)|(gif))$) {
            add_header Content-Disposition "attachment; filename=$filename";
        }
    }

    location /static {
        root /project_root;
    }

これにより、一部の high_res フォルダー (MEDIAROOT/high_rest) 内のすべての画像が強制的にダウンロードされます。その他の静的ファイルについては、通常どおりに動作します。これは、私のために機能する変更されたクイックハックであることに注意してください。セキュリティに影響する可能性があるため、注意して使用してください。

于 2008-12-22T15:06:40.363 に答える
4

django.views.static.serve ビュー用の簡単なデコレータを作成しました

これは私にとって完璧に機能します。

def serve_download(view_func):
    def _wrapped_view_func(request, *args, **kwargs):
        response = view_func(request, *args, **kwargs)
        response['Content-Type'] = 'application/octet-stream';
        import os.path
        response['Content-Disposition'] = 'attachment; filename="%s"' % os.path.basename(kwargs['path'])
        return response
    return _wrapped_view_func

また、nginx MIME タイプで遊ぶこともできます

http://wiki.codemongers.com/NginxHttpCoreModule#types

ファイルへの直接リンク(たとえば、ユーザーが画像を表示できるようにするため)とダウンロードリンクの両方が必要だったため、このソリューションはうまくいきませんでした。

于 2008-11-04T21:40:16.760 に答える
0

私が今やっていることは、「ビュー」とは異なるダウンロード用の URL を使用し、ファイル名を URL 引数として追加することです。

通常のメディア リンク:http://xx.com/media/images/lores/f_123123.jpg ダウンロード リンク:http://xx.com/downs/hires/f_12323?beach008.jpg

そしてnginxには次のような設定があります:

    location /downs/ {
        root   /var/www/nginx-attachment;
        add_header Content-Disposition 'attachment; filename="$args"';
    }

しかし、私はそれのにおいが本当に好きではありません。

于 2008-11-04T22:09:11.117 に答える