• 締切済み

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; です!ただし画像はまだまったく理解できていません! もしお分かりの人は教えてくれるとうれしいです! よいご指導まってます!

みんなの回答

  • W_H
  • ベストアンサー率47% (21/44)
回答No.3

多少あいまいでしたね。 あれはデコードの処理を全てCGIモジュールに任せて、置き換えるという意味でした。(つまり、オリジナルデコード処理を全て削除する) なので、デコード処理をしている #フォームからデータを受け取り変数へ入れる (省略) foreach $tmp (@indata) #フォームの要素分(省略){ (省略) } が必要ありません。 ついでにbgbgさんの言う$query->param()で読み出した値のヒントを出しておきます。例の該当場所を削除し、どこかの変数名を変えれば正常に動くはずです。 ヒント: <input type="text" name="name">のデータは、六行目の[$name =$query->param('name');]の処理により、すでに$nameに入っている。 ちなみに、ファイル名は$fileに入っている。

kuritinn
質問者

お礼

W_H様、bgbg様本当にありがとうございました。 多少理解するのに苦労した物の詳しい説明のおかげで超初心者でも出来るようになりました。本当に感謝してます。 さてこれから画像のファイル名を指定した名前保存出来るように勉強いたします。またわからない事があると思いますがご指導お願いします。 それでは頑張って勉強してきます。 ありがとうございました。

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.2

このページを読めば、まず問題は解決します。 "CGIモジュールによるアップロード・ファイルの受け取り"を参照のこと。 http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83%A1%E3%83%A2%2FCGI%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB#i1 一応解説すると、 new CGI;した時点でSTDINの中身は読み出されて空になります。 なので$formin,$forminhには何も中身が入っていません。 $query->param()で読み出した値を使用してください。

kuritinn
質問者

お礼

W_H様、bgbg様本当にありがとうございました。 多少理解するのに苦労した物の詳しい説明のおかげで超初心者でも出来るようになりました。本当に感謝してます。 さてこれから画像のファイル名を指定した名前で保存出来るように勉強いたします。またわからない事があると思いますがご指導お願いします。 それでは頑張って勉強してきます。 ありがとうございました。

  • W_H
  • ベストアンサー率47% (21/44)
回答No.1

画像のアップロードがしたいのなら、楽な方法があります。 3行目から#既存ファイルを読み込み~の手前までを use CGI;#CGIモジュールの使用 $query = new CGI; $file =$query->param('file'); $name =$query->param('name'); #$変数 = $query->param(フォームの名前);というルールで読み込み。 という、CGIモジュールにデコード処理を任せ、データを送るHTMLを <form action="CGIアドレス" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="text" name="name"> <input type="submit" value="送信"> </form> という感じにします。<form>の[enctype="multipart/form-data]がファイルのデータを転送する場合には必須です。 最後に、#新しいデータが追記された~の4行の処理の後に、画像ファイルをアップロードする $dir='image/';#ディレクトリへの相対パス。今回は適当にimage/ $newfile=$file; open(IMAGE, ">$dir$newfile") || die "error"; binmode(IMAGE);#バイナリモードで開く binmode(STDOUT);#バイナリモードで出力 while (<$file>) {print IMAGE $_;} close(IMAGE); を書き加えます。 これで、任意のディレクトリに画像がアップロードできるはずです。 CGIモジュールを使わずにすることもできるそうですが、これが手軽です。 ちなみに、今回の[binmode]は画像問わず、バイナリデータ(テキストファイルじゃないもの全て)をアップロードする時に使えます。

kuritinn
質問者

補足

W_H様どうもありがとうです。画像UPできました。出来たと同時に次は文字がTXTに書き込まれてないみたいです。 新しく追加したスクリプト見ていただければ光栄です! #!/usr/bin/perl use CGI;#CGIモジュールの使用 $query = new CGI; $file =$query->param('file'); $name =$query->param('name'); #フォームからデータを受け取り変数へ入れる 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); $dir='./bana/';#ディレクトリへの相対パス。今回は適当にimage/ $newfile=$file; open(IMAGE, ">$dir$newfile") || die "error"; binmode(IMAGE);#バイナリモードで開く binmode(STDOUT);#バイナリモードで出力 while (<$file>) {print IMAGE $_;} close(IMAGE); print "Content-type: text/html\n\n"; print <<"HTML"; データの書き込みが完了しました。<BR> お名前=$forminh{'name'}<BR> HTML exit; と、このように書き加えたところ画像は指定のデイリクトに入ることができましたが文字の方がTXTに書き込まれないみたいです。でもTXTファイルのファイルサイズ、フォームから送るごっとに上がっていくのでTXTファイルの中身見ると改行が追加されて行ってるみたいです。どこがいけないのでしょうか?何回もすみません。またご指導してもらえれば嬉しいです。ちなみにHTMLの方は <FORM method="POST" action="./55.cgi" enctype="multipart/form-data"> 名前:<INPUT size="20" type="text" name="name"><BR> 画像:<INPUT size="40" type="file" name="file"> <INPUT type="submit" value="送信する"> です!宜しくお願いします。