【Python】CGIプログラミングでファイルをアップロードする方法をわかりやすく解説
ファイルアップロードの基本
CGIを使ってファイルをアップロードするには、HTMLフォームのenctype属性をmultipart/form-dataに設定する必要があります。これは通常のテキスト送信とは異なり、ファイルデータをサーバーへそのまま送るために不可欠な指定です。また、type="file"を指定したinputタグを配置すると、ファイルを選択するための「参照(Browse)」ボタンが自動的に表示されます。
HTMLフォームの例
以下は、ファイルアップロード用のシンプルなHTMLフォームの例です。
<html>
<body>
<form enctype = "multipart/form-data"
action = "save_file.py" method = "post">
<p>File: <input type = "file" name = "filename" /></p>
<p><input type = "submit" value = "Upload" /></p>
</form>
</body>
</html>実行結果
このコードをブラウザで開くと、次のようなフォームが表示されます。
File: [ファイルを選択] [Upload]
アップロードを処理するPythonスクリプト
続いて、送信されたファイルを受け取り、サーバー上に保存するためのスクリプト「save_file.py」の例を紹介します。
#!/usr/bin/python
import cgi, os
import cgitb; cgitb.enable()
form = cgi.FieldStorage()
# アップロードされたファイル名を取得
fileitem = form['filename']
# ファイルがアップロードされているかチェック
if fileitem.filename:
# ディレクトリトラバーサル攻撃を防ぐため、
# ファイル名から先頭のパス部分を取り除く
fn = os.path.basename(fileitem.filename)
open('/tmp/' + fn, 'wb').write(fileitem.file.read())
message = 'ファイル「' + fn + '」は正常にアップロードされました'
else:
message = 'ファイルがアップロードされていません'
print """\
Content-Type: text/html\n
<html>
<body>
<p>%s</p>
</body>
</html>
""" % (message,)WindowsとUnix/Linuxでの注意点
このスクリプトをUnix/Linux環境で動かす場合は、パスの区切り文字(ファイルセパレータ)の扱いに注意が必要です。以下のように、バックスラッシュをスラッシュに置き換えてからos.path.basename()を呼び出すようにしてください。
fn = os.path.basename(fileitem.filename.replace("\\", "/" ))一方、Windows環境では置き換えを行わなくても、元のopen()ステートメントのままで問題なく動作します。
補足:最新のPython環境での扱いについて
なお、上記コードはPython 2系の記法(print文)を使用しています。さらに標準ライブラリのcgiモジュール自体も、Python 3.11で非推奨となり、Python 3.13では削除されました。新規プロジェクトでは、FlaskやDjango、Werkzeugなどが提供するマルチパートデータ解析機能を利用するのが推奨されるため、用途に応じて使い分けてください。
-
PythonでPDFファイルをExcelファイルに変換する方法を解説
Pythonには、さまざまな処理に対応できる豊富なライブラリが用意されています。本記事では、その中でもPDFファイルをExcelファイルに変換する方法について詳しく解説します。PythonでPDFをCSV形式に変換できるパッケージは複数存在しますが、ここではTabula-pyモジュールを使用します。Tabula-pyの主要部分はJavaで書かれており、PDFドキュメントを読み込み、PythonのDataFrameとして取得したり、JSONオブジェクトに変換したりすることができます。事前準備:JavaのインストールTabula-pyを使用する前に、システムにJavaが事前にインストールされている
-
Pythonでファイルの名前を変更する方法【os.renameとshutil.moveの使い方】
Pythonでファイル名を変更する基本の方法Pythonでファイルの名前を変更するには、標準ライブラリの os モジュールにある rename() メソッドを使うのが最も一般的な方法です。例えば、カレントディレクトリに a.txt というファイルがあり、これを b.txt にリネームしたい場合は、次のように記述します。os.rename() を使った例>>> import os>>> os.rename(a.txt, b.txt)このコードを実行すると、a.txt のファイル名が b.txt に変更されます。非常にシンプルで、単純なリネーム処理には最適です。