• 締切済み

画像ファイルの別名保存(CGI)

サーバーに既にある画像ファイル(test.gif)を別名に変えて保存するCGIを作ろうとしています(ただのリネームではなく、結果的に元の画像ファイルと名前を変更した画像ファイルの2つがサーバーに残るようにしたいです)。 ファイルハンドルによる関連付けで、test.gifを一度@aaa配列として読み込み、その@aaa配列を使って「bbb.gif」に書き出すという文を書いて見ましたが、生成されるファイルは画像ファイルとして表示してくれずにエラーとなってしまいます。 どなたか解決方法がわかる方アドバイスをお願いしますm(_ _)m 以下ソースです。 --------- open (IN,"test.gif"); @aaa = <IN>; close (IN); open (OUT,"> bbb.gif"); print OUT @aaa; close (OUT); ------ ↑はgifファイルではなくtxtファイルだと上手く行きます。 参考にしたサイトは↓です。 http://www.aimix.jp/cgi/syohofileread.html http://www.aimix.jp/cgi/syohofilewrite.html よろしくお願いしますm(_ _)m

  • CGI
  • 回答数1
  • ありがとう数2

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

画像ファイルなので、 @aaa = <IN>; というような読み方がうまくないですね。 binmode を設定するとか $/ を"" とかundef して@aaaじゃなくて、$aaaで全部読むとか read を使うとか 色々あると思いますが 標準モジュール File::Copy が使えれば use File::Copy; copy("test.gif","bbb.gif") or die "Copy failed: $!"; でいいんじゃないかと思います。

harunoji
質問者

お礼

ご指導していただいた use File::Copy; copy("test.gif","bbb.gif") or die "Copy failed: $!"; の方法で無事に走りました! ありがとうございました!! また何かあればよろしくお願いします!!

関連するQ&A

  • ハッシュを使った集計結果の出力について

    ハッシュを使った集計結果の出力について testフォルダに以下のファイルがあるとします。  aaa_1、aaa_2、bbb_1、bbb_2、ccc_1、・・・ 各ファイルには○△×がついた行があり、 「aaa」のファイル(aaa_1とaaa_2)の○△×の数、「bbb」のファイルの○△×の数、を集計したいと思っています。 出力イメージは以下です。  ファイル名の一部,○の数,△の数,×の数  aaa,13,59,37 ファイル名の一部をキーとして、 ○△×の回数を値にしたハッシュで集計しようとしましたが、 以下のようになってしまいました。 ,0,0,0 ,0,0,0,0,0,0 aaa,13,59,0 aaa,13,59,0,13,59,37 bbb,20,10,0 bbb,20,10,0,20,10,30 ハッシュが十分に分かっていないので、おかしなことをしてるのだと思うのですが。。 ご教授くださいますよう、お願いします。 opendir(DIR, $dir); while ($file = readdir(DIR)){  $maru =0;  $san =0;  $batu =0;  $file =~/(.*)_(.*)/;  $name = $1;  open(IN, "$dir/$file");   while ( $line = <FIN1> )   {    chomp( $line );    if($line =~/○/){      $maru++;    }elsif($line =~/△/){      $san++;    }elsif($line =~/×/){      $batu++;    }  } push(@{$test{$name}} , $maru,$san,$batu); @gyou = ( $name , join ("," , @{$test{$name}})) ; print OUT join (",", @gyou). "\n"; } close (IN); close (OUT);

    • ベストアンサー
    • Perl
  • ファイル読み込みマッチングについて

    現在二つのファイルをつき合わせて一致しない ファイルを出力するようなものを作っています。 例ですが。 ---a.txtココカラ--- aaa bbb ccc ---ココマデ--- ---b.txtココカラ--- aaa ccc ddd fff ---ココマデ--- 上記ファイルを照らし合わせて 以下のファイルを出力 ---c.txtココカラ--- bbb ---ココマデ--- のように出力させたいのですが。 自分の作成したものは ---a.plココカラ--- open(IN1,"a.txt") || die $!; open(IN2,"b.txt") || die $!; open(OUT,">c.txt") || die $!; sub hikaku { while(<IN2>){ if($a eq $b){ return; } } print OUT "$a"; return; } while(<IN1>){ $a = $_; &hikaku; } close(IN1); close(IN2); close(OUT); ---ココマデ--- いろいろテストをしてわかったことですが サブルーチンの while(<IN2>) そのままに なる一回しか回らないことがわかりました。 これは偽になった後、サブルーチンを抜けまた 回ってきた時に偽と判断されるからでしょうか? プログミング自体始めたばかりなので、こんなん あかんに決まってるやん!とか一からだなこれ!! とか導いていただけるなら厳しいご指摘お待ちして おります。 長くなりましたがよろしくお願い致します!!

    • ベストアンサー
    • Perl
  • cgiで動画ファイルをアップロードするには?

    みなさん、はじめまして。 私は今、HP製作中のおやじです。 昨日、フリーのCGIダウンロードしました。 このCGIは、PC上のJPG、GIFファイルを自動で連番.JPG,連番.GIFという具合に元のファイル名を連番にしてサーバーにアップロードしてくれる「日記帳的」CGIです。 *そこでチョット加工してWORD,EXCELファイルもアップロード出来る様にしました。 *ついでに動画ファイル(MPG,AVI,MOV)も アップロード出来る様にしたいのですが、どうしたらいいのか解かりません。この辺がもうおやじの限界です。 どなたか、ヘルプお願いいたします。 *ちなみにCGIソースはこうなっています。  これだけでわかるでしょうか? sub img { $type = ''; foreach (@in) { if ($_ =~ /Content-type:(.+)/i) { if ($1 =~ /image\/.*jpg/i) {$type = 'jpg';} elsif ($1 =~ /image\/gif/i) {$type = 'gif';} elsif ($1 =~ /msword/i) {$type = 'doc';} elsif ($1 =~ /ms-excel/i) {$type = 'xls';} elsif ($1 =~ /pdf/i) {$type = 'pdf';} last; } } if (!$type) {&error("このファイルはアップロードできません");} $img_file = "$_[0].$type"; open(OUT,">$img_file") || &error("画像ファイルを作成できません"); binmode OUT; print OUT $in{'img'}; close OUT; chmod (0666,$img_file); } ---------以上--------------------------------

    • ベストアンサー
    • CGI
  • HTMLのフォームで画像と文字を同時に指定したテキストファイルとフォルダーに書き出す方法教えてください!

    はじめましてCGI超初心者ですけどわかる方ご指導お願いいたします!僕が作りたいのはHTMLのフォームで画像と文字(フォームから相手が記入した値)を画像は指定したフォルダーにアップして文字は指定したTXTファイルに書き出しするってのを作りたいのですがどうにかみもうみまねで文字は指定したテキストに書き出すことはできたのですがどうも画像がわかりません。どうか教えてください!現時点でできてるスクリプトを書いときます。 #!/usr/bin/perl #フォームからデータを受け取り変数へ入れる read(STDIN, $formin, $ENV{'CONTENT_LENGTH'}); # + 記号を半角スペースに戻す $formin =~ tr/+/ /; #URLエンコードデータをデコード $formin =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; @indata = split (/&/,$formin); #受け取ったデータを&で区切り、配列へ foreach $tmp (@indata) #フォームの要素分(配列分)以下の処理を繰り返す { ($name,$value) = split (/=/,$tmp); # =記号で区切り、名前 と 値 に分ける $forminh{$name} = $value; #区切った名前を付けた連想配列に値を入れる } #既存ファイルを読み込み、配列@aaa に入れる open (IN,"test.txt"); @aaa = <IN>; close (IN); #フォームから受け取ったデータを配列の先頭に追加する #その際に各要素はコンマで区切り、後で使えるようにする unshift (@aaa,"$forminh{'name'}\n"); #新しいデータが追記された配列を test.txt に書き出す open (OUT,">test.txt"); print OUT @aaa; close (OUT); print "Content-type: text/html\n\n"; print <<"HTML"; データの書き込みが完了しました。<BR> お名前 $forminh{'name'}<BR> HTML exit; です!ただし画像はまだまったく理解できていません! もしお分かりの人は教えてくれるとうれしいです! よいご指導まってます!

  • 文字変換で,を改行されないようにしたい

    下記のスクリプトでファイルから読み込んだ行毎の文字列<>を'=>'に変換後、行の先頭に'を付け足し行の最後に',を付け加えた場合、変な風に改行されてしまいます。 $ cat list1.txt 01<>ああああ 01_01<>あAAA 01_02<>あBBB 01_03<>あCCC 01_04<>あDDD 02<>いいいい 02_01<>いAAA 02_02<>いBBB 02_03<>いCCC 02_04<>いDDD open(IN, "<list1.txt"); @datas = <IN>; close(IN); open(OUT, ">date.txt"); foreach (@datas) { ($a, $b) = split(/<>/, $_); print OUT "'$a'=>'$b',"; } close(OUT); 実行結果 $ cat date.txt '01'=>'ああああ ','01_01'=>'あAAA ','01_02'=>'あBBB ','01_03'=>'あCCC ','01_04'=>'あDDD ','02'=>'いいいい ','02_01'=>'いAAA ','02_02'=>'いBBB ','02_03'=>'いCCC ','02_04'=>'いDDD ', これを下記のように整形するにはスクリプトのどこを直せばよいのでしょうか。 '01'=>'ああああ', '01_01'=>'あAAA', '01_02'=>'あBBB', '01_03'=>'あCCC', '01_04'=>'あDDD', '02'=>'いいいい', '02_01'=>'いAAA', '02_02'=>'いBBB', '02_03'=>'いCCC', '02_04'=>'いDDD', どなたかご教授お願い致します。(上記のスクリプト以外の方法で スマートなやり方などありましたらあわせてご教授頂けますと助かります。)

    • ベストアンサー
    • Perl
  • perlでファイルを分割してファイル名も出力したい

    >AA A AAA aaaaaaaaaaaaaaa aaaaaaaaaaaa >BBB BB B bbbbbbbbbbbbbbb bbbbbbbbbbbbbbb bbbbbbbbbbbbbb ・ ・ こういった形式でテキストが入った大きいサイズのひとつのファイルを ・ファイル名 AA A AAA ・テキスト内 >AA A AAA aaaaaaaaaaaaaaa aaaaaaaaaaaa ・ファイル名 BBB BB B ・テキスト内 >BBB BB B bbbbbbbbbbbbbbb bbbbbbbbbbbbbbb bbbbbbbbbbbbbb となるように個別に出力させたいのですがどのようにすればよいでしょうか? #!/usr/bin/perl -w use strict; my $first; my $file; $first = 1; open(IN,"分割前ファイル"); foreach(<IN>) { if ( /^>(.*)/ ) { if ($first == 0 ) { close(OUT); } else {$first = 0; } $file = $1; $file =~ s/[\r\n]//; open(OUT,">$file"); } else { print OUT $1; print OUT $_; } } close(IN); このようなプログラムを組んだのですが、出力結果はファイル名についてはいいのですが、テキスト内が思ったようにいきません。 ・ファイル名 AA A AAA ・テキスト内 AA A AAAaaaaaaaaaaaaaaa AA A AAAaaaaaaaaaaaa このような結果になってしまいます。 どなたか対処方をわかるかたがいましたらお願いします。

    • ベストアンサー
    • Perl
  • CGI によるファイルのアップロード

    こんにちは。Perl初心者です。 ファイルのアップロードのプログラムを作ったのですが(と言っても書籍の丸写しですが..)サーバー上でエラーになってしまいます。どこが間違っているか教えて下さい。 環境:@niftyのホームページ(CGIは許可されています。), PC: Windows XP ソース: #!/usr/local/bin/perl use CGI qw(:standard); $file1 = param('file1'); open OUT, "> $file1"; while(<$file1>){   print OUT $_; } close OUT; $file2 = param('file2'); open OUT, "> $file2"; while(<$file2>){   print OUT $_; } close OUT; print <<"EOL"; Content-type: text/html <html> <body> Files have been uploaded.<br> $file1<br> $file2<br> </body> </html> EOL exit;

    • 締切済み
    • CGI
  • CGIで画像表示されなくGIF89aXとなります、なぜ?

    CGI初心者です。 CGI可のレンタルサーバーで、CGIで画像を表示させたいのですが、 ブラウザで見ると画像がでません。 画像の位置、パーミッションなどは何度も確認しました。 転送はバイナリです。 ------------- #!/usr/bin/perl $view = 'r1.gif'; print "Content-type: image/gif\n\n"; open IMGG,"$view"; binmode (IMGG); print <IMGG>; close (IMGG); ------------------------ このCGIのhttp:~CGIを直接打つとブラウザに 「GIF89aX」とでて画像が出ません。 画像をhttp:~で直接指定するとちゃんと画像が出ます。  なぜでしょう? すぐに回答ほしいです。 どなたか詳しい方、よろしくお願いしま~す。

    • ベストアンサー
    • CGI
  • 画像リサイズCGI

    画像をリサイズするCGIを捜しています。 http://www.hidekik.com/rszim/rszim.html 上記のサイトのCGIが理想(縦横変換率%と面積変換率%があること)に近かったのですが、ユーザーがアクセスし画像をアップロードして使用するものではなく、 元々サーバーにある画像のみをリサイズ対象とするCGIを捜しています。 例えば、ですが rszim.cgiが指定したimageフォルダに、複数の画像(test1.gif、test2.jpg...)を入れておき、http://***/rszim.cgi?test1.gifというような、URLに画像名含むアドレスにアクセスすることで、その画像(test1.gif)のみリサイズ可能なものを捜しています。 できれば、フリーが望ましいです。perl・PHP問いません。GDはインストール済みです。

    • 締切済み
    • CGI
  • javascriptでのファイル更新について

    prototype.jsのAjax.Updaterでファイルを閲覧することはできたのですが、 ファイルを更新する方法が分かりません。 javascriptでファイルを更新することは不可能なのでしょうか。 perlで言うところの ============================== require "./cgi-lib.pl"; &ReadParse(); open(FH, ">> aaa.txt"); print FH $in{'bbb'}; close(FH); ============================== みたいな処理がしたいです。 環境の制約によりcgiが使えないのでなんとかjavascriptで実現できないかと考えています。

専門家に質問してみよう