CGIでファイル表示・削除のための方法を探しています

このQ&Aのポイント
  • 特定のディレクトリ内の「jpg」ファイルのみを表示するCGIを探しています。
  • また、ユーザーIDが含まれる画像のみを表示する機能も必要です。
  • 具体的な実装方法についてはよく分かっていないため、詳しい説明をお願いします。
回答を見る
  • ベストアンサー

ファイル表示・削除CGI

ディレクトリ内の特定ファイルの表示と削除が出来る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点ですが、説明不足かもしれません。何をしたいのかが良く伝わっていなければ補足お願いします。 よろしくお願いします。

  • CGI
  • 回答数4
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答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は数字のみで構成されることを前提にしています。(-は含まれないこと)

master-3rd
質問者

お礼

すみません補足です。 if ($Mode eq "del"){ &del; } は if ($mode eq "del"){ &del; } じゃないとだめですよね。大文字小文字を間違えていました。 そのためちゃんと「画像削除終了」は表示しますが、削除がされていません。 修正すべき点がありましたらお願いします。

master-3rd
質問者

補足

返答ありがとうございます。 無事指定のファイルだけ表示することが出来ました。 しかも、質問を載せ終わった後に気が付いた「もしも日付とユーザー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; } サブルーチン「デリート」は、とりあえず用です。後で「この画像を削除しました」のようなサムネイルを表示したり、「編集画面に戻る」のようなボタンをつける予定です。 こうしてみましたが、消える気配も無くサブルーチンに移動している気配もありません。 何がいけないのでしょうか? よろしくお願いします。

その他の回答 (3)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答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が、削除すべきファイルがセットされているか、確認したほうがよいと思います。(万一、削除の権限がなくて、ファイルが削除できないこともありますから)

master-3rd
質問者

お礼

返答遅れてすみません。 あれからいろいろとやった結果、上記の件に関しては解決しました。 しかし、新たな問題が発生してしまいました。 CGIをちゃんと分けるため1個上のディレクトリに移動してみたのですが、正常に動かなくなってしまいました。 opendir DIR,"./"; @dir_value = readdir DIR; close (DIR); この部分だと思うのですが、画像が入っているのはこのディレクトリ内の「img」ディレクトリです。 普通に考えて「opendir DIR,"./img";」としてみてもCGIがあるディレクトリを表示してしまいます。 他にも「./img/」「/img」「/img/」もやってみましたが全滅です。 下位ディレクトリを表示させるのには他に方法があるのでしょうか? よろしくお願いします。

master-3rd
質問者

補足

今まで返答ありがとうございました。 お礼に追加の質問を書き込みましたが、返答がいただけなかったようです。 回答が急いで必要になってしまったので、再度質問をあげさせていただきます。 返答ありがとうございました。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

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)
回答No.3

No1です。 >そのためちゃんと「画像削除終了」は表示しますが、削除がされていません。 unlink("./$d_img"); この文は問題ありません。問題があるとすれば、$d_imgに正しく削除すべきファイル名がセットされているかです。 <a href=$script?mode=del&d_img=$_>[この画像を削除]</a> で行っているように見えますが、ここの意味がよくわかりません。CGI自体はよく解りませんのでなんとも、言えないのですが、&d_img=$_で$d_imgに$_の内容が設定されるのでしょうか。また、$_は、foreach文などで使用された時のループ中の暗黙の変数名です。この文は、そうした中で使用しているのでしょうか。 また、削除しようとしているのは選択された1つのファイルだけでしょうか。それとも表示された全てのファイルでしょうか。

master-3rd
質問者

補足

>、&d_img=$_で$d_imgに$_の内容が設定されるのでしょうか。 >$_は、foreach文などで使用された時のループ中の暗黙の変数名です。この文は、そうした中で使用しているのでしょうか。 その通りです。画像を数枚用意して頭の部分(IDの部分ですね)を同じに、日付を変えて保存してみました。 <a href=$script?mode=del&d_img=$_>[この画像を削除]</a> はファイル名を表示する後ろに表示するように設定しているのでちゃんと繰り返していますし、IDもちゃんと変化しています。 このことからわかっていただけると思いますが、削除するのは1つずつのファイルです。 各ファイルのサムネイルを表示、その隣にファイル名・サイズ・最終更新日、その隣に上記[この画像を削除]ボタンを配置しています。 全ソースを載せたほうが良いでしょうか?

関連するQ&A

  • CGIで画像が表示されません

    こんにちは。最近フレッツADSLに変更し、ISPのダイナミックDNSも利用できますので、 自前WEBサーバを立ち上げようとしております。 現在、Win2000Proで Apache for win32 1.3.22、 ActivePerl-5.6.1.630で 何とかWEBサーバは稼動しております。 通常のHTMLは表示可能です。CGIも動作しますが、そのCGI内で表示しようとする画像(GIF,JPG,PNG)が表示されません。 (Xマーク状態です。これはcgi-bin配下ディレクトリ内です)プロパティをみても、パスは良さそうなのですが・・。 以前いたISPはcgiwrapを使用していましたので苦労しました。同じ状態です。 confファイルを書き直す事で可能?やっぱりCGIディレクトリに画像は不可?と 2つの疑問で行き詰まっております。 cgiのあるディレクトリに.htaccessを置き AddHandler server-parsed .gif .jpg .png でもダメでした。 パスの指定が悪いのかなー^^;なんか、トンチンカンな失敗の気もしますが・・・。 どなたかお力添え頂ければ幸いです。

    • 締切済み
    • CGI
  • ディレクトリ内のファイルを一覧表示するCGIを探しています

    指定したディレクトリ内にあるファイルを一覧表示しリンクを自動で作ってくれるCGIを探しています 自分で探してみたところ、いくつか見つけられたのですがなかなか条件にあうCGIが無かったので・・・ ↓こんなの探してます ・携帯でも見れるシンプルなもの ・ファイルの並び順(名前順や最新順)を設定できる  ↑観覧者が自由にソートするのではなくサーバー側(?)で決めれる ・1ページに表示するファイルの数を設定できる ・指定ディレクトリ内にディレクトリがあった場合それもリンク あとできれば画像ファイルを開いたときに「進む」で次のファイルに移動などの機能があればうれしいです どうかよろしくおねがいします・・・

    • 締切済み
    • CGI
  • ローテーションで表示させるCGI

    バナー管理のCGIはたくさんあるのですが、大体が表示方法がアットランダムです。定められたローテーションで表示させるCGIをご存じないでしょうか? つまり、N個の画像ファイルをサーバーのあるデイレクトリに保存します。方やhtmlファイルには、(N-X)個の画像の位置を指定ておいて、ローテーションで順番に表示されるCGIです。 ご存じの方、ご教示お願いいたします。

    • 締切済み
    • CGI
  • フォルダー内を表示させるcgi

    ディレクトリにindex.html等がないときに 中にあるファイルが一覧で出力される、apacheのような機能の付いた cgiを使っているのですが、 -------------- 始まり #!/usr/local/bin/perl opendir(DIR,"./"); @item = readdir(DIR); $out = ""; foreach $file (@item){ $out .= "<a href=$file>$file</a>\n"; } print <<EOF; Content-type: text/html <html> <head> <title>All Files</title> </head> <body> <pre> $out </pre></body></html> EOF -------------------終わり 特定の拡張子ファイルだけを出力しないようにするにはどうしたらいいでしょうか?(例えば、.cgiなど。上位ディレクトリに登る「.」「..」も出さない) ディレクトリやファイルを判別して表示を変えたり、ファイルサイズや ファイルが置かれた、更新された時間も表示するようにしたいです。 宜しくお願いします。

    • 締切済み
    • CGI
  • 一覧を表示しCGI経由でファイル表示

    またまた質問させていただけないでしょうか? 前回回答して頂いた方法でどうにか中盤まで書けました。有難う御座います。 またつっかかっている部分があります。 あるフォルダーにあるファイル名一覧を表示します。 そのファイル名をクリックするとCGI経由でファイル を開くというものなのですが・・・。 どうも上手くいきません。 流れとしては 1.ディレクトリ「master」の中身一覧を取得 2.それを表示 1.一覧の中のあるファイル名をクリック。 2.[CGI]あるファイルを読み込む。 3.あるファイルを表示。

    • ベストアンサー
    • Perl
  • インターネット一時ファイルを削除できるCGIプログラム教えて下さい。

    今、画像のアップロードCGIを作成したのですが、 インターネット一時ファイルに画像ファイルが 残っていて、最新のものが表示できません。 画像に新しいファイル名をつけて保存ができません ので(仕様上)、インターネット一時ファイルを 削除できるCGIがあったら、プログラム教えて下さい。 ヒントでも良いです。困っています。 教えて下さい。

    • ベストアンサー
    • CGI
  • ライブカメラ画像を保存するには(cgi)

    よそのHP上にある、ライブカメラの画像を 自分用に保存したいのですがうまくできません。 ネットスケープ専用のライブカメラだそうで、 ブラウザはこれの6です。 メニューで、「名前をつけて保存」「画像を保存」 また「画像を表示」してから保存などすると .cgiのファイルになってしまいます。 このファイルを開いて画像を見る方法、または jpgなどにして画像を保存する方法を教えてください!

  • CGIで画像ファイルのアップロード

    CGIで画像をアップロードできる掲示板をつくっているのですが、 gif、png、bmp、jpgなどの画像ファイルの縦横のサイズを取得する方法がわかりません。 縦横の比率を変えないでサムネイル表示させたいと思っているのですが、どうしたらよいでしょうか??

    • ベストアンサー
    • Perl
  • リストにデータがあれば1回だけ表示…

    更新記録CGIを改造して新商品入荷情報CGIとして利用しています。 お客様からメールでの問い合わせを受けるときに"どの商品についてか"というのを明確にしたいと考えています。 さらにちょっと改造して、もしこのジャンルの商品があった場合は「商品ありますよ」を一番上に表示して下にリストを(商品リストを抜き出して<select>で表示させる方法はわかりました)、無ければ「今は無いですよ」だけを表示させたいです。 少ない知識で作ってみましたが、うまく出来ません。 open (FILE,"$data"); @file = <FILE>; close FILE; foreach $data (@file) { chomp; ($contents, $name) = (split(/<>/, $data)); if ($contents eq $in{'id'} && $name eq "" ){ print "<OPTION value=\"無商品\">現在購入できる商品はありません</OPTION>\n"; }else{ print "<OPTION value=\"未選択\">商品名を選択してください</OPTION>\n"; } } IDはジャンル名でnameは商品名です。この状態だと、各項目が複数出てしまいます。 何かこれ以上に足りない情報があれば指摘してください。すぐに記入します。 よろしくお願いします。

    • 締切済み
    • CGI
  • CGI実行ディレクトリ以下の画像やHTMLファイルをブラウザから表示(

    CGI実行ディレクトリ以下の画像やHTMLファイルをブラウザから表示(参照)できるかCGIを使って判定したいのです、SOCKETを使ってURLで呼び出し返ってくるコードを判定すればいいのはわかるのですがSOCKETでの応答ができないサーバーもあり不確実です、もっと簡単に確実にCGIで判定する方法はありますか?

    • 締切済み
    • CGI

専門家に質問してみよう