ディレクトリ内の特定ファイルの表示と削除が出来る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点ですが、説明不足かもしれません。何をしたいのかが良く伝わっていなければ補足お願いします。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
以下の様にしてください。
まず、下記の文を(削除)コメントにします。
-----------------------------
#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は数字のみで構成されることを前提にしています。(-は含まれないこと)
この回答への補足
返答ありがとうございます。
無事指定のファイルだけ表示することが出来ました。
しかも、質問を載せ終わった後に気が付いた「もしも日付とユーザー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;
}
サブルーチン「デリート」は、とりあえず用です。後で「この画像を削除しました」のようなサムネイルを表示したり、「編集画面に戻る」のようなボタンをつける予定です。
こうしてみましたが、消える気配も無くサブルーチンに移動している気配もありません。
何がいけないのでしょうか?
よろしくお願いします。
すみません補足です。
if ($Mode eq "del"){ &del; }
は
if ($mode eq "del"){ &del; }
じゃないとだめですよね。大文字小文字を間違えていました。
そのためちゃんと「画像削除終了」は表示しますが、削除がされていません。
修正すべき点がありましたらお願いします。
No.4
- 回答日時:
><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/」もやってみましたが全滅です。
下位ディレクトリを表示させるのには他に方法があるのでしょうか?
よろしくお願いします。
No.3
- 回答日時:
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つずつのファイルです。
各ファイルのサムネイルを表示、その隣にファイル名・サイズ・最終更新日、その隣に上記[この画像を削除]ボタンを配置しています。
全ソースを載せたほうが良いでしょうか?
No.2
- 回答日時:
No1です。
>そのためちゃんと「画像削除終了」は表示しますが、削除がされていません。
unlink("./$d_img");
この文は問題ありません。問題があるとすれば、$d_imgに正しく削除すべきファイル名がセットされているかです。
<a href=$script?mode=del&d_img=$_>[この画像を削除]</a>
で行っているように見えますが、ここの意味がよくわかりません。CGI自体はよく解りませんのでなんとも、言えないのですが、&d_img=$_で$d_imgに$_の内容が設定されるのでしょうか。また、$_は、foreach文などで使用された時のループ中の暗黙の変数名です。この文は、そうした中で使用しているのでしょうか。
また、削除しようとしているのは選択された1つのファイルだけでしょうか。それとも表示された全てのファイルでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System32内のファイルを書き換...
-
google Drive 容量を減らせない...
-
VBで作成したフォームのタイト...
-
エクセル等でハイパーリンクの...
-
Cドライブにconfig msiというフ...
-
エクセルを立ち上げるとBook2が...
-
ファイルの削除ができません
-
J2SE Runtime Environment 5.0 ...
-
アクロバットリーダーのファイ...
-
【VBA】写真の縦横比を変えずに...
-
Not kind:Folders
-
常に「すべての列のサイズを自...
-
シャットダウン時に自動ファイ...
-
貼り付けとショートカットの貼...
-
検索したファイルの場所を調べ...
-
拡張子.EXTの解凍方法
-
突然エクセルのデータが何ヶ月...
-
VB.net 任意の例外を発生させ...
-
Ububtuでファイル共有できない...
-
自分のユーザー名フォルダに鍵...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System32内のファイルを書き換...
-
google Drive 容量を減らせない...
-
エクセルを立ち上げるとBook2が...
-
Cドライブにconfig msiというフ...
-
Apoint2Kってスパイウェアでし...
-
Desktopという構成設定のアイコ...
-
CentOS7で容量がきつくなったの...
-
Googleドライブで削除できない...
-
Dosコマンドで2階層下をワイル...
-
デスクトップに同じ名前のファ...
-
ファイルの削除ができません
-
アドオンの管理で削除ができない
-
System Volume Information
-
Excel VBAで特定のシートの左側...
-
エクセル等でハイパーリンクの...
-
体言止について (日本語文法)
-
アクロバットリーダーのファイ...
-
Visual C++ でクラスを削除する
-
Windowsコマンドでファイル削除...
-
退職前にパソコンをきれいにし...
おすすめ情報