前提
-
nginxのCGIを動かす
までができていること。
上述したリンクの設定を引き継いだ前提で、ディレクトリ構成を行なっています。
nginxのconfigurationも前回の設定のままで変更不要です。(.pyのロケーションにPOSTを許可しなくても動作するのが不思議ですが、、)
ステップ1: nginxとfcgiwrapの起動を確認
fcgiwrapが起動していることを確認
コマンド
ps aux | grep fcgiwrap
_www 30072 0.0 0.0 410629888 1344 ?? Ss 10:45AM 0:00.01 /opt/homebrew/Cellar/fcgiwrap/1.1.0/sbin/fcgiwrap
みたいなのが出ればOKです。
nginxが起動していることを確認
コマンド
ps aux | grep nginx
_www 30145 0.0 0.0 411434160 2272 ?? S 10:46AM 0:00.06 nginx: worker process
と root 30144 0.0 0.0 410740656 288 ?? Ss 10:46AM 0:00.00 nginx: master process nginx
みたいなのが出ればOKです。
どちらかがうまくいっていない場合はnginxのCGIを動かすを参照して、起動させてください。
ステップ2: ディレクトリとファイルの準備
アップロード先ディレクトリの準備
作成
mkdir /opt/homebrew/Cellar/nginx/1.25.4/html/upload
権限変更
sudo chmod 777 /opt/homebrew/Cellar/nginx/1.25.4/html/upload
htmlファイル(ユーザーのインターフェース)の準備
upload.htmlの作成
以下のディレクトリにてupload.htmlを作成する。
cd /opt/homebrew/Cellar/nginx/1.25.4/html
upload.htmlの内容
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ファイルアップロード</title>
</head>
<body>
<h2>ファイルアップロード</h2>
<form action="/upload.py" method="post" enctype="multipart/form-data">
ファイルを選択:
<input type="file" name="file">
<input type="submit" value="アップロード">
</form>
</body>
</html>
upload.htmlファイル権限の変更はいらないと思いますが、permissionのエラーが出た場合は権限を変更してください。
.pyファイル(postメソッドを行う)の準備
upload.pyの作成
以下のディレクトリにてupload.pyを作成する。
cd /opt/homebrew/Cellar/nginx/1.25.4/cgi-bin
upload.pyの内容
#!/opt/homebrew/bin/python
import cgi
import os
from http import cookies
import cgitb; cgitb.enable() # CGIデバッグを有効化
form = cgi.FieldStorage()
# ファイルアップロードフィールドのチェック
fileitem = form['file']
if fileitem.filename:
# ウェブサーバ上のディレクトリへのファイルパスを設定
fn = os.path.basename(fileitem.filename)
filepath = '/opt/homebrew/Cellar/nginx/1.25.4/html/upload/' + fn
with open(filepath, 'wb') as f:
f.write(fileitem.file.read())
message = 'ファイル "{}" のアップロードに成功しました'.format(fn)
else:
message = 'ファイルがアップロードされませんでした'
# HTMLコンテンツをUTF-8として出力
print("Content-Type: text/html; charset=utf-8\n")
print("""
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>アップロード結果</title>
</head>
<body>
<p>{}</p>
</body>
</html>
""".format(message))
* 1行目の#!/opt/homebrew/bin/python
はあなたのPCの環境設定に合わせてください
もし、cgi-binディレクトリの権限が_wwwで、ファイルの作成ができない場合は以下の対応を行なってください。
対応① upload.htmlをデスクトップに作成する。
対応② sudo + mvコマンドでファイルを移動する。例sudo mv path_to/upload.html /opt/homebrew/Cellar/nginx/1.25.4/cgi-bin
権限変更
.pyの実行権限を全てのユーザーにします
sudo chmod 777 cd /opt/homebrew/Cellar/nginx/1.25.4/cgi-bin/upload.py
ステップ3:ブラウザからアップロード
ブラウザからhttp://localhost:8100/upload.py
にアクセスして、ファイルをuploadすると、/opt/homebrew/Cellar/nginx/1.25.4/html/upload
にファイルがあるはずです。
今回はここまで!