2

重複の可能性:
応答としてファイル名を設定する方法

私はMongoDBにファイルを保存しています。Pyramidからファイルを提供するには、次のようにします。

# view file
def file(request):
    id = ObjectId(request.matchdict['_id'])
    collection = request.matchdict['collection']
    fs = GridFS(db, collection)
    f = fs.get(id)
    filename, ext = os.path.splitext(f.name)
    ext = ext.strip('.')
    if ext in ['pdf','jpg']:
        response = Response(content_type='application/%s' % ext)
    else:
        response = Response(content_type='application/file')
    response.app_iter = FileIter(f)
    return response

この方法を使用すると、ファイル名はデフォルトでObjectIdファイルの文字列になりますが、これはきれいではなく、正しいファイル拡張子がありません。ドキュメント内でResponseオブジェクト内のファイルの名前を変更する方法/場所を確認しましたが、表示されません。どんな助けでも素晴らしいでしょう。

4

2 に答える 2

4

ファイル名を設定する100%確実な方法はありません。ファイル名を思い付くのはブラウザ次第です。

とはいえ、Content-Dispositionヘッダーを使用して、ファイルを表示するのではなくダウンロードするようにブラウザーに指定できます。また、そのファイルに使用するファイルのファイル名を提案することもできます。次のようになります。

Content-Disposition: attachment; filename="fname.ext"

ただし、ASCII以外の文字でファイル名を指定するための信頼できるクロスブラウザの方法はありません。詳細については、このstackoverflowの質問を参照してください。quoted-stringまた、ファイル名にエンコーディングを使用するように注意する必要があります。ASCII以外の文字をすべて削除し、"引用符で囲んだファイル名を作成する必要があります\"

次に、ピラミッド固有のものについて説明します。Content-Disposition応答にヘッダーを追加するだけです。(これは有効なmimeタイプapplication/fileではないことに注意してください。 「一般的な」バイト単位のバッグタイプとして使用してください。)application/octet-stream

# "application/file" is not a valid mime type!
content_subtype = ext if ext in ['jpg','pdf'] else 'octet-stream'

# This replaces non-ascii characters with '?'
# (This assumes f.name is a unicode string)
content_disposition_filename = f.name.encode('ascii', 'replace')

response = Response(content_type="application/%s" % content_subtype,
                    content_disposition='attachment; filename="%s"' 
                      % content_disposition_filename.replace('"','\\"')
           )
于 2012-10-25T22:20:16.747 に答える
3

Content-Dispositionヘッダーを設定する必要があるようです。

response.content_disposition = 'attachment; filename=%s' % filename
于 2012-10-25T21:57:41.293 に答える