※このサンプルの解説は、「CGI(Perl)の解説」をすべて読み終えてる方を前提としています。
■ ファイル名の変更ツール
サーバーにアップしているファイルやサーバー側で自動作成されたファイルのファイル名をブラウザだけで変更するツールです。
サーバー側で自動作成されるファイルが、サーバーによってはFTP接続で変更できない場合があります。
そういった場合に利用するといいでしょう。
このツールは、サーバー側で実行されるため、サーバー側で自動作成されたファイルなら問題なく変更できます。
また、FTP接続を使いませんから、別の場所や別のパソコンからも操作ができます。
ただ、その場合は「セキュリティ」面で注意が必要ですが、このサンプルでは「ユーザーID」と「パスワード」で保護してます。
- 【 解 説 】
-
まず、「HTML」で変更したいファイル名と、変更後のファイル名を入力するフォームを作ります。
また、この処理を勝手に使われる事を避けるため、「ユーザーID」と「パスワード」の入力ボックスも用意し、管理者権限でなければ使用できないようにします。入力フォームの記述サンプルは次のような感じ。
<form method="post" action="fname.cgi"> 変更前のファイル名:<input type="text" name="filnam1"><br> 変更後のファイル名:<input type="text" name="filnam2"><br><br> ユーザー名:<input type="text" name="userid"><br> パスワード:<input type="password" name="userpwd"><br><br> <input type="submit" value="変更"> </form>このフォームから入力されたパラメータを取得するにはいくつかの特殊な処理が必要です。
パラメータの取得方法や分離方法は「CGIサンプル」−「投稿フォームの作成」で解説していますのでここでは省略します。ファイル名を変更する命令は次のような記述方法を取ります。
rename (変更前のファイル名),(変更後のファイル名);具体的には、次のような感じです。
rename "page1.html","page2.html";取得したパラメータを使用してファイル名を変更する場合は、次のように記述します。
rename $prm{filnam1},$prm{filnam2};「ユーザー名」と「パスワード」のチェックについては「CGIサンプル」−「ファイルのパーミッション変更ツール」で解説してますのでそちらを参照してください。
「ユーザー名」と「パスワード」のチェックに、結果表示なども組み込むと次のような感じになります。
if (($prm{userid} eq $userid) and ($prm{userpwd} eq $userpwd)){ rename $prm{filnam1},$prm{filnam2}; print "変更完了!<br><br>\n"; print "変更前のファイル名:$prm{filnam1}<br>\n"; print "変更後のファイル名:$prm{filnam2}<br>\n"; }else{ print "<h3>ユーザーID、パスワードが違います。</h3>"; }
では、まず入力用のフォームを「HTML形式」で作成します。
ファイル名は「fname.html」とするといいでしょう。
- 【記述サンプル】
- <HTML> <HEAD> <title>ファイル名の変更</title> </HEAD> <BODY> <div align="center"> <h4>【ファイル名の変更】</h4> </div> <table cellpadding="8" border="1" align="center"> <tr> <td bgcolor="#eeeeff"> <form method="post" action="fname.cgi"> 変更前のファイル名:<input type="text" name="filnam1"><br> 変更後のファイル名:<input type="text" name="filnam2"><br><br> ユーザー名:<input type="text" name="userid"><br> パスワード:<input type="password" name="userpwd"><br><br> <input type="submit" value="変更"> </form> </td></tr></table> <br> </BODY> </HTML>
次に、入力フォームのデータを取得してファイル名を変更するCGIを作成します。
このCGIのファイル名は「fname.cgi」にしてください。
- 【記述サンプル】
- #!/usr/bin/perl $len = read(STDIN, $param, 1024); $param =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge; @plist = split(/&/, $param); foreach $strdat (@plist){ ($key, $val) = split(/=/, $strdat); $prm{$key} = $val; } $userid = "test"; $userpwd = "test"; if (($prm{userid} eq $userid) and ($prm{userpwd} eq $userpwd)){ rename $prm{filnam1},$prm{filnam2}; print "変更完了!<br><br>\n"; print "変更前のファイル名:$prm{filnam1}<br>\n"; print "変更後のファイル名:$prm{filnam2}<br>\n"; }else{ print "<h3>ユーザーID、パスワードが違います。</h3>"; }
- ◆実行結果について
-
上記のサンプルをそれぞれ「fname.html」、「fname.cgi」という名前で保存して実行してみてください。
(注意)
サーバーでテストする場合は、前もってアクセスログを記録するための、何もデータの入っていない「inpfrmf.cgi」という名前のファイルをパーミッション「666」で必ず作成しておいて下さい。実行結果はこちらをクリックしてください。
このサンプルはファイル名変更の命令を止めてますので、結果が表示されるだけで、実際にファイル名が変更できるわけではありません。
なお、実行結果については、各々のサーバーの環境、ユーザーの環境にによって内容は変わってきます。