- ベストアンサー
CGIでファイル表示・削除のための方法を探しています
- 特定のディレクトリ内の「jpg」ファイルのみを表示するCGIを探しています。
- また、ユーザーIDが含まれる画像のみを表示する機能も必要です。
- 具体的な実装方法についてはよく分かっていないため、詳しい説明をお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
以下の様にしてください。 まず、下記の文を(削除)コメントにします。 ----------------------------- #foreach (sort @dir_value) { # if ($_ =~ /\.[^\.]+/) { push (@files,$_); } # elsif ($_ ne '.' && $_ ne '..') { push (@list,$_); } #} #foreach (@files) { push (@list,$_); } -------------------------------------- その後に、以下の文を追加します。 -------------------------------------- $uid = '0001'; #説明の為付加 -------------------------------------- @files = grep(-f,@dir_value); #ファイルのみを取り出す @files = grep(/\.jpg$/,@files); #拡張子.jpgを取り出す foreach (@files){ #ユーザIDの一致かつ次の文字が-のファイルだけを取り出す if ($_ =~ m/^($uid)\-/) { push(@list,$_); } } @list = sort (@list); #名前をソートする -------------------------------------------- $uidにはユーザIDが設定されているものとします。 この設定方法は、説明上$uid='0001'としましたが、この設定は、あなたが責任を持って行ってください。 ファイル名の先頭がユーザIDでかつ次の一文字が'-'であることを前提としています。ユーザIDは数字のみで構成されることを前提にしています。(-は含まれないこと)
その他の回答 (3)
- tatsu99
- ベストアンサー率52% (391/751)
><a href=$script?mode=del&d_img=$_>[この画像を削除]</a> はファイル名を表示する後ろに表示するように設定しているのでちゃんと繰り返していますし、IDもちゃんと変化しています。 ここの文での不明点は、 1)&d_img=$_ ではなく、$d_imgでは無いでしょうか。 2)繰り返し中で$d_imgに$_をセットした場合、最後の$_のみがセットされませんでしょうか。 この文は、削除ボタンが押下される前に画面に表示しているところで、呼び出しているように見えます。 削除ボタンが選択された時に、その削除ボタンに該当するファイル名を$d_imgにセットすべきだと思うのですが・・・。 >ソースを載せたほうが良いでしょうか? $d_imgにファイル名を設定しているところの前後の文を提示していただけませんでしょうか。 また、念の為、$_imgの内容をsub delの中で(一時的にでも)だすようにして、$_imgが、削除すべきファイルがセットされているか、確認したほうがよいと思います。(万一、削除の権限がなくて、ファイルが削除できないこともありますから)
お礼
返答遅れてすみません。 あれからいろいろとやった結果、上記の件に関しては解決しました。 しかし、新たな問題が発生してしまいました。 CGIをちゃんと分けるため1個上のディレクトリに移動してみたのですが、正常に動かなくなってしまいました。 opendir DIR,"./"; @dir_value = readdir DIR; close (DIR); この部分だと思うのですが、画像が入っているのはこのディレクトリ内の「img」ディレクトリです。 普通に考えて「opendir DIR,"./img";」としてみてもCGIがあるディレクトリを表示してしまいます。 他にも「./img/」「/img」「/img/」もやってみましたが全滅です。 下位ディレクトリを表示させるのには他に方法があるのでしょうか? よろしくお願いします。
補足
今まで返答ありがとうございました。 お礼に追加の質問を書き込みましたが、返答がいただけなかったようです。 回答が急いで必要になってしまったので、再度質問をあげさせていただきます。 返答ありがとうございました。
- tatsu99
- ベストアンサー率52% (391/751)
No1です。 >そのためちゃんと「画像削除終了」は表示しますが、削除がされていません。 unlink("./$d_img"); この文は問題ありません。問題があるとすれば、$d_imgに正しく削除すべきファイル名がセットされているかです。 <a href=$script?mode=del&d_img=$_>[この画像を削除]</a> で行っているように見えますが、ここの意味がよくわかりません。CGI自体はよく解りませんのでなんとも、言えないのですが、&d_img=$_で$d_imgに$_の内容が設定されるのでしょうか。また、$_は、foreach文などで使用された時のループ中の暗黙の変数名です。この文は、そうした中で使用しているのでしょうか。 また、削除しようとしているのは選択された1つのファイルだけでしょうか。それとも表示された全てのファイルでしょうか。
- tatsu99
- ベストアンサー率52% (391/751)
No1です。 >そのためちゃんと「画像削除終了」は表示しますが、削除がされていません。 unlink("./$d_img"); この文は問題ありません。問題があるとすれば、$d_imgに正しく削除すべきファイル名がセットされているかです。 <a href=$script?mode=del&d_img=$_>[この画像を削除]</a> で行っているように見えますが、ここの意味がよくわかりません。CGI自体はよく解りませんのでなんとも、言えないのですが、&d_img=$_で$d_imgに$_の内容が設定されるのでしょうか。また、$_は、foreach文などで使用された時のループ中の暗黙の変数名です。この文は、そうした中で使用しているのでしょうか。 また、削除しようとしているのは選択された1つのファイルだけでしょうか。それとも表示された全てのファイルでしょうか。
補足
>、&d_img=$_で$d_imgに$_の内容が設定されるのでしょうか。 >$_は、foreach文などで使用された時のループ中の暗黙の変数名です。この文は、そうした中で使用しているのでしょうか。 その通りです。画像を数枚用意して頭の部分(IDの部分ですね)を同じに、日付を変えて保存してみました。 <a href=$script?mode=del&d_img=$_>[この画像を削除]</a> はファイル名を表示する後ろに表示するように設定しているのでちゃんと繰り返していますし、IDもちゃんと変化しています。 このことからわかっていただけると思いますが、削除するのは1つずつのファイルです。 各ファイルのサムネイルを表示、その隣にファイル名・サイズ・最終更新日、その隣に上記[この画像を削除]ボタンを配置しています。 全ソースを載せたほうが良いでしょうか?
お礼
すみません補足です。 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; } サブルーチン「デリート」は、とりあえず用です。後で「この画像を削除しました」のようなサムネイルを表示したり、「編集画面に戻る」のようなボタンをつける予定です。 こうしてみましたが、消える気配も無くサブルーチンに移動している気配もありません。 何がいけないのでしょうか? よろしくお願いします。