3

ユーザーがデータベースに保存されているファイルをダウンロードできるように、Web サイトに機能を追加しています。問題は、ユーザーのファイル名を正しく指定できないことです。代わりに、ユーザーは、Web サイトを実行しているメインの Python スクリプトの名前でファイルを保存するように求められます。Content-Disposition 情報を設定していますが、期待どおりに機能しません。コードを次のように編集しましたが、それでも機能しません。

import sys, os
import mydatabasemodule
PDFReport = [...read file from database ...]
print('Content-Type: application/octet-stream\n')
print('Content-Disposition: attachment; filename=\"mytest.pdf\"\n')
print(report)
sys.stdout.close()

このコードを実行すると、ユーザーはファイルを mysite.py としてダウンロードするように求められます。PDF は間違ったファイル名で正しくダウンロードされます。

ここで私が間違っていることを誰かに教えてもらえますか? 完全版のコードでは、Content-Description と Content-Length も設定しましたが、これも失敗します。ファイルは小さいので、ディスクに保存しないようにしていますが、そうしても同じ問題が発生します。

[編集] ウェブサーバーは CentOS 5.5、Python 2.4.3、Apache 2.2.3、および mod_python を実行しています。Google Chrome 17.0.963.46 ベータ版と Firefox 13 を使用して、Ubuntu 11.04 クライアントでこれをテストしました。代わりに PDF をインラインで表示しようとすると、次のようになります。

print('Content-type: application/pdf\n')
print('Content-Disposition: inline; filename=\"mytest.pdf\"\n')
print("Content-Length: %d" % len(report))

その後、Chrome は (プラグインを使用して) PDF を表示し、Firefox はファイルを保存するように要求し、PDF として認識しますが、ファイル名が間違っています。つまり、ファイル名はまだスクリプト名です。

[編集] 解決策は、Mike によって以下に示されました。問題は、上記の最初の行に追加した改行だったと思います。print は改行を追加するため、この 2 番目の改行はヘッダーの終わりを示しているため、Content-Disposition 行は読み取られませんでした。迅速なご協力ありがとうございました。

4

1 に答える 1

3

Python バージョン < 3.0 では、print は関数ではなく、改行文字が自動的に追加されます。これを試して。

import sys, os
import mydatabasemodule
PDFReport = [...read file from database ...]
print 'Content-Type: application/octet-stream'
print 'Content-Disposition: attachment; filename="mytest.pdf"'
print
sys.stdout.write(PDFReport)
sys.stdout.flush()
于 2012-06-06T21:12:16.370 に答える