※ ChatGPTを利用し、要約された質問です(原文:ファイル表示・削除CGI)
CGIでファイル表示・削除のための方法を探しています
このQ&Aのポイント
特定のディレクトリ内の「jpg」ファイルのみを表示するCGIを探しています。
また、ユーザーIDが含まれる画像のみを表示する機能も必要です。
具体的な実装方法についてはよく分かっていないため、詳しい説明をお願いします。
ディレクトリ内の特定ファイルの表示と削除が出来るCGIを探しています。
「CGIScriptMarket」さんの「Web_Index」で出来るのですが、このままでは全部のファイル・下位ディレクトリを表示してしまうため使えません。改造が必要なのですが、良い方法が見つかりません。
表示したいのは「jpg」ファイルのみです。
そこで、消極的ですが、リスト振り分けを行っているであろう部分に(CGIの60行目当たり"foreach (@list) {"内に)
(($_ eq '.') or ($_ eq '..') or /\.cgi$/ or /\.htaccess$/ or /\.pl$/ or /\.dat$/ or /\.db$/) and next;
を追加しました。これで他のファイルは表示しなくなりましたが下位ディレクトリを表示してしまいます。
この方法ではなく、「jpgファイルだけを表示する」方法があるでしょうか?
素人的な文章だと
if(@list eq .jpg){表示する…}
これもおかしいですよね。eqだと"同じ"にならないとだめですよね。他にちゃんとした書き方があると思うのですが…
さらに、保存される画像を誰が消しても言いというわけではないです。IDとPASSによって入場した場所にこのCGIを設置します。
画像はIDと日付という組み合わせで保存されます。(0001-031013.jpgのような形)
そこで、ユーザーIDが入っている画像のみ表示するという機能も必要です。
仕方は上の方法とかぶるかもしれませんが、文字列の一部に含まれるものと比較する(この表現もおかしかったりして…)仕方も良くわかっていません。
以上2点ですが、説明不足かもしれません。何をしたいのかが良く伝わっていなければ補足お願いします。
よろしくお願いします。
お礼
すみません補足です。 if ($Mode eq "del"){ &del; } は if ($mode eq "del"){ &del; } じゃないとだめですよね。大文字小文字を間違えていました。 そのためちゃんと「画像削除終了」は表示しますが、削除がされていません。 修正すべき点がありましたらお願いします。
補足
返答ありがとうございます。 無事指定のファイルだけ表示することが出来ました。 しかも、質問を載せ終わった後に気が付いた「もしも日付とユーザーIDが一緒になったら??」という点も"-"が付いたものがIDという形で処理する方法まで明記していただきありがとうございました。 さて、次の点ですが、ファイルの削除です。ない知恵を絞ってやってみたのですが、うまく出来ませんでした。 まずは、デリートモードが必要ですよね。 以下のようにやってみました。 著作権表示部分のすぐ下に、 require './jcode.pl'; を挿入。もちろんファイル「jcode.pl」を同フォルダにコピー $script = "index.cgi"; を追加。 表示化開始される前の部分(スタイルシート表記の次)に &decode; if ($Mode eq "del"){ &del; } を追加。 先ほどのリスト表示部分に <a href=$script?mode=del&d_img=$_>[この画像を削除]</a> を追加。 2つのサブルーチンを一番最後に追加。デコード文は他のCGIからのコピーです。 ################ デコード ################### sub decode { local($buffer, $name, $value, @pairs); if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach (@pairs) { ($name, $value) = split(/=/); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # S-JIS変換 &jcode'convert(*value, "sjis", "", "z"); $in{$name} = $value; } $mode = $in{'mode'}; } ################ デリート ################### sub del{ # 写真削除 unlink("./$d_img"); print "Content-type:text/html\n"; print "Pragma: no-cache\n\n"; print "<html>\n<head>\n<title>$title</title>\n$style</head>\n$body\n"; print "<CENTER><h1>File Eraser</h1></CENTER>\n<hr noshade>\n"; print "<BR>\n"; print "画像削除終了\n"; print "</body>\n</html>\n"; exit; } サブルーチン「デリート」は、とりあえず用です。後で「この画像を削除しました」のようなサムネイルを表示したり、「編集画面に戻る」のようなボタンをつける予定です。 こうしてみましたが、消える気配も無くサブルーチンに移動している気配もありません。 何がいけないのでしょうか? よろしくお願いします。