※このサンプルの解説は、「CGI(Perl)の解説」をすべて読み終えてる方を前提としています。

■ ファイルのコピーツール

このツールはサーバーにアップしているファイルやサーバー側で自動作成されたファイルをコピーして新しいファイルを作成します。

サーバー側のファイルは、FTPで接続してもコピーができません。
したがって、コピーを作るには、一度ダウンロードした後名前を変更し、そのファイルをアップロードするという方法を取らないといけません。
これはいろんな意味で手間がかかります。

小さいサイズのファイルならまだいいですが、ファイルサイズが大きくなると結構時間もかかります。
このツールを使えばサーバー側でダイレクトに処理しますので高速ですし、ブラウザだけで処理が完結します。
ただ、その場合は「セキュリティ」面で注意が必要ですが、このサンプルでは「ユーザーID」と「パスワード」で保護してます。

【 解    説 】

まず、「HTML」でコピー元のファイル名と、コピー後のファイル名を入力するフォームを作ります。
また、この処理を勝手に使われる事を避けるため、「ユーザーID」と「パスワード」の入力ボックスも用意し、管理者権限でなければ使用できないようにします。

入力フォームの記述サンプルは次のような感じ。
<form method="post" action="fcopy.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サンプル」−「投稿フォームの作成」で解説していますのでここでは省略します。

ファイルをコピーする命令は、Perlの標準命令ではなく、拡張モジュールとなっていますが、最近のサーバーならおそらく使用出来るでしょう。
命令は次のような記述方法を取ります。
use File::Copy; copy((コピー元のファイル名), (コピー後のファイル名));

具体的には、次のような感じです。
copy("page1.html","page2.html");

取得したパラメータを使用してファイルをコピーする場合は、次のように記述します。
use File::Copy;
copy($prm{filnam1},$prm{filnam2});

「ユーザー名」「パスワード」のチェックについては「CGIサンプル」−「ファイルのパーミッション変更ツール」で解説してますのでそちらを参照してください。

「ユーザー名」「パスワード」のチェックに、結果表示なども組み込むと次のような感じになります。
if (($prm{userid} eq $userid) and ($prm{userpwd} eq $userpwd)){   use File::Copy;   copy($prm{filnam1}, $prm{filnam2}) or $errsw0 = 1;   if ($errsw0 == 1){     print "$prm{filnam1} を $prm{filnam2} にコピーできません。";   }else{     print "$prm{filnam1} を $prm{filnam2} にコピーしました。";   } }else{   print "<h3>ユーザーID、パスワードが違います。</h3>"; }

では、まず入力用のフォームを「HTML形式」で作成します。
ファイル名は「fcopy.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="fcopy.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を作成します。
ファイル名は「fcopy.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)){   use File::Copy;   copy($prm{filnam1}, $prm{filnam2}) or $errsw0 = 1;   if ($errsw0 == 1){     print "$prm{filnam1} を $prm{filnam2} にコピーできません。";   }else{     print "$prm{filnam1} を $prm{filnam2} にコピーしました。";   } }else{   print "<h3>ユーザーID、パスワードが違います。</h3>"; }
◆実行結果について

上記のサンプルをそれぞれ「fcopy.html」「fcopy.cgi」という名前で保存して実行してみてください。

実行結果はこちらをクリックしてください。
このサンプルはファイルコピーの命令を止めてますので、結果が表示されるだけで、実際にファイルがコピーできるわけではありません。
なお、実行結果については、各々のサーバーの環境、ユーザーの環境にによって内容は変わってきます。


page update:2010/01/23 20:32

Copyright (c) 2000-2009, all Rights Reserved & Produced by atom