PythonでFormデータの受け渡し処理

_python-title1 

フォームからデータを受け取る

import cgi

form = cgi.FieldStorage()
text = form.getvalue("text")
fileitem = form['media']
radio_value = form.getvalue("radio_name")
checkbox_values = form.getlist("checkbox_name")

 

form = cgi.FieldStorage()

 cgi.FieldStorage()クラスのインスタンスを作成し、form変数に代入。

 

text = form.getvalue("text")

 formオブジェクトから"text"という名前のフォームフィールドの値を取得し、text変数に代入。

 

fileitem = form['media']

 formオブジェクトから"media"という名前のファイルアップロードフォームフィールドを取得し、fileitem変数に代入。

 

radio_value = form.getvalue("radio_name")

ラジオボタンの値を取得は、グループ内から1つしか値を選択できないため、getvalueメソッドで十分。

 

checkbox_value = form.getvalue("checkbox_name")
checkbox_values = form.getlist("checkbox_name")

チェックボックスの値は、1つしかなければgetvalueメソッドで十分。

複数ある場合は、getlistメソッドを使う必要がある。

 

 

受け取った値の表示

print(text)
print(fileitem.filename)
print(radio_value)
print(checkbox_value)

#複数チェックボックス
checkbox_values = form.getlist("checkbox_name")
print("<ul>")
for value in checkbox_values:
    print(f"<li>{value}</li>")
print("</ul>")


# 値を大文字に変換して表示
for value in checkbox_values:
    print(value.upper())

# 値に応じて条件分岐
for value in checkbox_values:
    if value == "option1":
        print("Option 1 was selected")
    elif value == "option2":
        print("Option 2 was selected")
    # 他の値の処理

 

複数チェックボックスの場合は、返ってきたリストをforで回す。

 

 

ファイルのアップロード処理

import os

# ファイルがアップロードされたかどうかをチェック
if fileitem.filename:
    # ファイルの拡張子を取得
    file_ext = os.path.splitext(fileitem.filename)[1]

    # 新しいファイルを書き込みモードで開く
    with open(f"uploaded_file{file_ext}", "wb") as f:
        # アップロードされたファイルデータを読み込み、新しいファイルに書き込む
        f.write(fileitem.file.read())

 

ファイル名が存在するかどうかをチェックし、ファイル名が存在する場合、ファイルの拡張子を取得し、その拡張子を持つ新しいファイルを作成。

 

with open(fileitem.filename, "wb") as f:

 ファイル名をそのまま元の名前のまま使うなら上記のようにも書ける。

 

f.write(fileitem.file.read())

fileitem.file.read()でファイルの内容を読み取り、新しいファイルに書き込む。

 

 

任意のPathにアップロード

# 実行中のPythonファイルのディレクトリを取得
current_dir = os.path.dirname(os.path.abspath(__file__))
# アップロードディレクトリを相対パスで指定
upload_dir = os.path.join(current_dir, "img")
# アップロードディレクトリが存在しない場合は作成
os.makedirs(upload_dir, exist_ok=True)

# アップロードされたファイルが存在する場合
if fileitem.filename:
  # ファイルの内容を取得
  file_data = fileitem.value
  
  # アップロード先のファイルパス
  upload_path = os.path.join(upload_dir, fileitem.filename)
  
  # ファイルを保存
  with open(upload_path, 'wb') as f:
    f.write(file_data)
  
  print(f"ファイル {fileitem.filename} がアップロードされました")

else:
  print("ファイルが選択されていません")

 

ディレクトリを実行ファイルからの相対パスで指定してアップロード。

 

import os

doc_root = os.environ.get("APACHE_DOCUMENT_ROOT") # Apacheの場合
doc_root = os.environ.get("NGINX_DOCUMENT_ROOT") # Nginxの場合

サーバーのフルパス指定する場合はこのようにできる。

 

 

アップロードせずに直接ファイルデータをBase64エンコード

import base64

if fileitem.filename:
  # ファイルの内容を取得
  file_data = fileitem.value
  # メディアタイプを取得
  media_type = fileitem.type

  # ファイルをBase64エンコード
  base64_data = base64.b64encode(file_data).decode('utf-8')

  print(f"ファイル {fileitem.filename} がBase64エンコードされました<br>")
  print(base64_data)

 

base64_data変数をAPIなどにBase64エンコードしたデータとして渡す事が出来る。

 

 

入力チェック

import sys

if text is None or text.strip() == "":
  print("Content-Type: text/html; charset=UTF-8\n\n")
  print("<h1>Error!</h1>")
  sys.exit()


if fileitem.filename:
  #処理
else:
  #エラー処理
  print("Content-Type: text/html; charset=UTF-8\n\n")
  print("<h1>Error!</h1>")
  print("ファイルが選択されていません")
  sys.exit()