Pythonでファイルダウンロードダイアログを表示させる方法【HTTPヘッダーの設定】
はじめに
Webアプリケーションを開発していると、リンクをクリックした際にファイルの中身をブラウザ上に表示するのではなく、「ファイルのダウンロード」ダイアログボックスをポップアップ表示させたいケースがあります。
この動作は、HTTPヘッダーを適切に設定するだけで簡単に実現できます。ここで使うHTTPヘッダーは、通常のHTML出力時に指定するものとは異なる点に注意してください。
ダウンロードダイアログを実現する仕組み
ポイントは次の2つのHTTPヘッダーです。
- Content-Type:
application/octet-streamを指定することで、レスポンスが「バイナリデータ(任意のファイル)」であることをブラウザに伝えます。 - Content-Disposition:
attachmentを指定することで、ブラウザに対して「内容を表示せず、添付ファイルとして保存する」よう指示します。
サンプルコード
たとえば、FileName という名前のファイルを特定のリンクからダウンロード可能にしたい場合、Python(CGIスクリプト)では以下のように記述します。
#!/usr/bin/python
# -*- coding: utf-8 -*-
# HTTPヘッダーを出力
print("Content-Type: application/octet-stream; name=\"FileName\"\r\n")
print("Content-Disposition: attachment; filename=\"FileName\"\r\n\n")
# 実際のファイル内容をここに出力する
fo = open("foo.txt", "rb")
str = fo.read()
print(str)
# 開いたファイルを閉じる
fo.close()コードの解説
処理の流れは以下のとおりです。
- まず
Content-Typeヘッダーで、レスポンスが汎用のバイナリストリームであることを宣言します。 - 続いて
Content-Disposition: attachmentヘッダーで、filename属性に保存時のデフォルトファイル名を指定します。これにより、ブラウザはダウンロードダイアログを表示します。 - その後、対象ファイル(ここでは
foo.txt)をバイナリモード(rb)で開き、内容を読み込んで標準出力へ書き出します。 - 最後に
close()でファイルを確実に閉じます。
補足:実務での注意点
日本語などマルチバイト文字を含むファイル名を扱う場合は、ブラウザごとの互換性を考慮し、RFC 5987 に基づく filename*=UTF-8''... 形式の指定を併用すると安全です。また、大きなファイルを扱う際は、メモリ上に一括読み込みするのではなく、チャンク単位で読み出して出力する方法が推奨されます。
まとめ
HTTPヘッダーに application/octet-stream と Content-Disposition: attachment を指定するだけで、PythonのCGIスクリプトからでも簡単にファイルダウンロードダイアログを表示できます。ぜひ実際のプロジェクトで活用してみてください。
-
PythonのTkinterでポップアップダイアログを表示する方法【messagebox活用ガイド】
Tkinterは、GUIベースのアプリケーションを作成・開発するためのPython標準ライブラリです。Tkinterを使えばアプリケーションを構築し、さまざまなウィジェットを追加することで、よりインタラクティブな画面を作ることができます。ここでは、アプリケーション内でポップアップダイアログを表示する方法を紹介します。この場合に役立つのが、tkinterに組み込まれているmessageboxモジュールです。messageboxを使うと、エラーメッセージ、情報ボックス、確認ダイアログなど、さまざまな種類のダイアログボックスを簡単に表示できます。サンプルコード以下の例では、クリックすると画面上にポッ
-
Tkinterのファイルダイアログにフォーカスを与える方法
Pythonの標準GUIツールキットであるTkinterを使えば、機能豊富なデスクトップアプリケーションを簡単に構築できます。Tkinterには多数のパッケージや関数が用意されており、それぞれ異なる目的で活用されます。中でもfiledialogパッケージを利用すると、ローカルマシン上のファイルシステムとやり取りできるようになり、システム内の任意のファイルへアクセスしてCRUD操作(作成・読み込み・更新・削除)を実行できます。 ファイルダイアログにフォーカスを与えるポイント ファイルダイアログにフォーカスを与えるには、ダイアログに関連付ける親ウィンドウを用意するのがポイントです。メインウィンドウ