外部ファイルの入出力 |
入力画面
新規作成後の画面
編集画面
[サンプルプログラムの実行]
<TEXTAREA>タグでテキストを表示する際には、テキスト中にHTMLタグが含まれている場合があるので'<'を'<'に変換しておきます。'<'で表示した'<'はCGIに戻ってくるときには'<'になっていますので、入力の際の変換処理は不要です。
また、SJIS では '書き込み可能' の '能' の下位バイトがバックスラッシュ(\)のコードと一致しているので'能'の後には空白文字を入れておきます。詳しくは「日本語コードの取り扱い」の項を参照してください。
#!/usr/bin/perl # # fileio.cgi # # (C)1999 Kaoru Fujita # use lib './lib'; require 'util.pl'; # # 定数 # $Title = '外部ファイルの入出力サンプル'; $Location = './tmp'; $CGIPath = '/cgi-bin'; use File::Basename; $Program = basename($0); $Encoding = 'sjis'; $CharSet = 'Shift_JIS'; parseInput($Encoding); # テスト用 #$in{'Action'} = 'Create'; #$in{'File'} = 'abc'; #$in{'Data'} = '0123456789'; $act = $in{'Action'}; # Create/Add/Remove/Modify $file = $Location.'/'.$in{'File'}; $data = $in{'Data'}; print qq(Content-type: text/html\n\n); print qq(<HTML>\n); print qq(<HEAD>\n); print qq(<META HTTP-EQUIV="Content-Type" CONTENT="text/html\; charset=$CharSet"> \n); print qq(<TITLE>$Title</TITLE></HEAD>\n); print qq(<BODY>); if ($act eq 'Create') { if (!-e $Location) { mkdir($Location, 0755) or exitError("ディレクトリ $Location が作成できません。"); print qq(ディレクトリ $Location を作成しました。<BR>\n); } exitError("すでにファイル $file が存在します。") if (-e $file); open(FH, ">$file") or exitError("ファイル $file がオープンできませんでした。"); print FH $data,"\n" if ($data); print qq(ファイル $file を作成しました。 <BR>\n); close(FH); } elsif ($act eq 'Add') { open(FH, ">>$file") or exitError("ファイル $file がオープンできませんでした。"); print FH $data,"\n" ; print qq(ファイル $file に追加書き込みしました。<BR>\n); close(FH); } elsif ($act eq 'Open'){ my($mode); if (-e $file) { if (-w $file) { $mode = '書き込み可能 '; } else { $mode = '読み込み専用'; } } open(FH, "$file") or exitError("ファイル $file がオープンできませんでした。"); print qq(<P ALIGN="right">[<I>$file</I>]</P>\n); print qq(ファイルの内容 ($mode)<BR>\n); print qq(<FORM ACTION="$CGIPath/$Program", NAME="Form" METHOD="post">\n); print qq(<TEXTAREA NAME="Data" COLS="80" ROWS="24">); while (<FH>) { s/</</g; # テキスト中のHTMLタグをエスケープする print; } print qq(</TEXTAREA>\n); print qq(<INPUT TYPE="hidden" NAME="Action" VALUE="Modify">\n); print qq(<INPUT TYPE="hidden" NAME="File" VALUE="$in{'File'}">\n); print qq(<INPUT TYPE="submit" NAME="Submit" VALUE="保存">\n); print qq(</FORM>\n); close(FH); } elsif ($act eq 'Modify'){ exitError("ファイル $file に書き込むことができません。") unless (-w $file); open(FH, ">$file") or exitError("ファイル $file がオープンできませんでした。"); # \r\n を \n に変換する。 $data =~ s/\r\n/\n/g; print FH $data; print qq(ファイル $file を書き換えました。<BR>\n); close(FH); } elsif ($act eq 'Remove'){ if (-e $file) { unlink($file) or exitError("ファイル $file が削除できませんでした。"); print qq(ファイル $file を削除しました。<BR>\n); } else { print "ファイル $file は削除済みです。\n"; } } print qq(</BODY></HTML>\n); exit(0); #--End of fileio.cgi |
<HTML> <HEAD> <TITLE>外部ファイルの入出力サンプル</TITLE> <SCRIPT LANGUAGE="JavaScript"> <!-- function doIt(act) { document.Form.Action.value = act; document.Form.submit(); } //--> </SCRIPT> </HEAD> <BODY> <FORM ACTION="/cgi-bin/fileio.cgi" NAME="Form"> <INPUT TYPE="hidden" NAME="Action"> ファイル名: <INPUT TYPE="textfield" NAME="File" SIZE="24"><BR> <INPUT TYPE="button" NAME="Create" VALUE="新規作成" onClick=doIt('Create')> <INPUT TYPE="button" NAME="Open" VALUE="編集" onClick=doIt('Open')> <INPUT TYPE="button" NAME="Remove" VALUE="削除" onClick=doIt('Remove')> </FORM> </BODY> </HTML> |