Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python CGIでファイルダウンロードダイアログを表示させる方法

ファイルダウンロードダイアログとは

Webサイトを運営していると、ユーザーがリンクをクリックした際に、実際のコンテンツをブラウザ上に表示するのではなく、「ファイルダウンロード」ダイアログボックスをポップアップ表示させたいケースがあります。たとえば、テキストファイルやCSVデータをそのまま開かせず、保存させたい場合などが該当します。

この動作は、HTTPヘッダーを適切に設定するだけで簡単に実現できます。

HTTPヘッダーの設定方法

ポイントとなるのは、以下の2つのヘッダーです。

  • Content-Type: application/octet-stream — ファイルをバイナリデータとして扱い、ブラウザが自動的に内容を解釈・表示しないようにします。
  • Content-Disposition: attachment — コンテンツを添付ファイルとして扱うよう指示し、ダウンロードダイアログを表示させます。

サンプルコード(Python CGI)

たとえば、特定のリンクから「FileName」というファイルをダウンロードできるようにしたい場合、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")
data = fo.read()
print(data)

# 開いたファイルを閉じる
fo.close()

コードの解説

処理の流れは以下の通りです。

  1. まずContent-TypeヘッダーでMIMEタイプを「application/octet-stream」に指定し、ファイル名を通知します。
  2. 続いてContent-Dispositionヘッダーに「attachment」を指定することで、ブラウザにダウンロードダイアログを表示させます。
  3. ヘッダーの後は空行で区切り、そこから実際のファイル内容を出力します。
  4. 対象ファイル(ここでは foo.txt)をバイナリモードで読み込み、標準出力へ書き出した後、ファイルをクローズします。

注意点

日本語ファイル名などを扱う場合は、filenameパラメータのエンコーディングに注意が必要です。また、ヘッダーと本文の間には必ず空行を挿入しなければならないため、\r\n\nのような改行の付け忘れに気をつけてください。正しく設定すれば、ユーザーがリンクをクリックした瞬間にダウンロードダイアログが表示され、意図したファイルを保存してもらえるようになります。

  1. PythonのTkinterでポップアップダイアログを表示する方法【messagebox活用ガイド】

    Tkinterは、GUIベースのアプリケーションを作成・開発するためのPython標準ライブラリです。Tkinterを使えばアプリケーションを構築し、さまざまなウィジェットを追加することで、よりインタラクティブな画面を作ることができます。ここでは、アプリケーション内でポップアップダイアログを表示する方法を紹介します。この場合に役立つのが、tkinterに組み込まれているmessageboxモジュールです。messageboxを使うと、エラーメッセージ、情報ボックス、確認ダイアログなど、さまざまな種類のダイアログボックスを簡単に表示できます。サンプルコード以下の例では、クリックすると画面上にポッ

  2. Tkinterのファイルダイアログにフォーカスを与える方法

    Pythonの標準GUIツールキットであるTkinterを使えば、機能豊富なデスクトップアプリケーションを簡単に構築できます。Tkinterには多数のパッケージや関数が用意されており、それぞれ異なる目的で活用されます。中でもfiledialogパッケージを利用すると、ローカルマシン上のファイルシステムとやり取りできるようになり、システム内の任意のファイルへアクセスしてCRUD操作(作成・読み込み・更新・削除)を実行できます。 ファイルダイアログにフォーカスを与えるポイント ファイルダイアログにフォーカスを与えるには、ダイアログに関連付ける親ウィンドウを用意するのがポイントです。メインウィンドウ