2

Pyramid を使用して GridFS からファイルを提供するための最良かつおそらく最も簡単な方法は何だろうと思っています。nginx をプロキシ サーバー (ssl 用) として使用し、ウェイトレスをアプリケーション サーバーとして使用しています。

提供できるようにする必要があるファイルの種類は次のとおりです: mp3、pdf、jpg、png

ファイルは、次の URL "/files/{userid}/{filename}" からアクセスできる必要があります。

次のようにコードで content-type を明示的に設定したため、現在、ファイルはクライアント側の適切なアプリケーションによって開かれています。

if filename[-3:] == "pdf":
    response = Response(content_type='application/pdf')

elif filename[-3:] in ["jpg", "png"]:
    response = Response(content_type='image/*')

elif filename[-3:] in ["mp3"]:
    response = Response(content_type='audio/mp3')

else:
    response = Response(content_type="application/*")

response.app_iter = file   #file is a GridFS file object
return response

唯一のことは、mp3 を適切にストリーミングできないことです。audio.jsを使用して再生します。開いて再生しますが、トラックの長さが表示されず、シークできません。「accept-ranges」プロパティと関係があることは知っていますが、正しく設定できないようです。nginxまたはウェイトレスと関係がありますか? それとも、ヘッダーを正しく設定していないだけですか?

ここでreturn FileResponse(file)指定されているような簡単なものを使用したいのですが、私のファイルはファイルシステムから直接取得されません.これを機能させるプラグアンドプレイの方法はありますか?

アドバイスをいただければ幸いです。

ご助力ありがとうございます!

4

3 に答える 3

1

このブログで解決策を見つけました。

アイデアは、DataAppからパッチを適用することpaste.fileappです。すべての詳細は投稿にあり、今では私のアプリは私が望むように動作します!

于 2013-01-29T00:11:07.217 に答える
1

Pyramid 1.4、Python 3 で貼り付け依存関係なしで問題を解決しました。

属性「conditional_response=True」と「content_length」が重要なようです:

f = request.db.fs.files.find_one( { 'filename':filename, 'metadata.bucket': bucket } )

fs = gridfs.GridFS( request.db )

with fs.get( f.get( '_id') ) as gridout:
    response = Response(content_type=gridout.content_type,body_file=gridout,conditional_response=True)
    response.content_length = f.get('length')
    return response
于 2013-10-14T14:17:11.417 に答える
0

別の方法 (Python 2.7 で Pyramid 1.5.7 を使用):

fs = GridFS(request.db, 'MyFileCollection')
grid_out = fs.get(file_id)

response = request.response
response.app_iter = FileIter(grid_out)
response.content_disposition = 'attachment; filename="%s"' % grid_out.name

return response
于 2015-07-21T05:49:41.033 に答える