ユーザーがデータベースに保存されているファイルをダウンロードできるように、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 行は読み取られませんでした。迅速なご協力ありがとうございました。