はじめまして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;
です!ただし画像はまだまったく理解できていません!
もしお分かりの人は教えてくれるとうれしいです!
よいご指導まってます!
No.3ベストアンサー
- 回答日時:
多少あいまいでしたね。
あれはデコードの処理を全てCGIモジュールに任せて、置き換えるという意味でした。(つまり、オリジナルデコード処理を全て削除する)
なので、デコード処理をしている
#フォームからデータを受け取り変数へ入れる
(省略)
foreach $tmp (@indata) #フォームの要素分(省略){
(省略)
}
が必要ありません。
ついでにbgbgさんの言う$query->param()で読み出した値のヒントを出しておきます。例の該当場所を削除し、どこかの変数名を変えれば正常に動くはずです。
ヒント:
<input type="text" name="name">のデータは、六行目の[$name =$query->param('name');]の処理により、すでに$nameに入っている。
ちなみに、ファイル名は$fileに入っている。
W_H様、bgbg様本当にありがとうございました。
多少理解するのに苦労した物の詳しい説明のおかげで超初心者でも出来るようになりました。本当に感謝してます。
さてこれから画像のファイル名を指定した名前保存出来るように勉強いたします。またわからない事があると思いますがご指導お願いします。
それでは頑張って勉強してきます。
ありがとうございました。
No.2
- 回答日時:
このページを読めば、まず問題は解決します。
"CGIモジュールによるアップロード・ファイルの受け取り"を参照のこと。
http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83% …
一応解説すると、
new CGI;した時点でSTDINの中身は読み出されて空になります。
なので$formin,$forminhには何も中身が入っていません。
$query->param()で読み出した値を使用してください。
W_H様、bgbg様本当にありがとうございました。
多少理解するのに苦労した物の詳しい説明のおかげで超初心者でも出来るようになりました。本当に感謝してます。
さてこれから画像のファイル名を指定した名前で保存出来るように勉強いたします。またわからない事があると思いますがご指導お願いします。
それでは頑張って勉強してきます。
ありがとうございました。
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]は画像問わず、バイナリデータ(テキストファイルじゃないもの全て)をアップロードする時に使えます。
この回答への補足
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="送信する">
です!宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
window.open でのファイル指定方法
-
PerlでのUseless use...
-
JSP URLに表示される拡張子 .jsp
-
Firefox で file:// で始まる U...
-
VBAでCSVファイルを途中行まで...
-
VBAでCSVファイルの特定行を書...
-
DOSコマンドで、標準出力を出力...
-
batファイルでrenameができませ...
-
パスから最後のディレクトリだ...
-
VBAで巨大なファイルの途中から...
-
エクセルVBA コードが同じでも...
-
ReadLineでの読み出し行を指定する
-
バッチファイルの作り方(CSV→...
-
教えて!perlから.exeファイル...
-
fopenでディレクトリ内の全ファ...
-
dos変数の%~dp0は powershellで...
-
VB6.0でDB接続する際に切断時の...
-
close()で例外が投げられる理由
-
オーバーラップ計算法について
-
【エクセル】改行無しテキスト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
window.open でのファイル指定方法
-
python renameについて
-
csvファイルの横方向への改行に...
-
fgets で値が取得できない
-
drtファイルはどうしたら開...
-
VBA テキストファイルを読み取...
-
MATLABのm-fileについて
-
巨大なテキストの最終行を取得...
-
JSP URLに表示される拡張子 .jsp
-
行を指定して削除する方法PERL
-
ファイルの存在の有無を確かめ...
-
MySQLにバイナリデータを正常に...
-
fortranのopen文について。
-
AutoNts
-
WindowsでPerlをする際,1行目の...
-
フォルダ内のファイルを全て開...
-
Firefox で file:// で始まる U...
-
コマンドライン引数で正規表現...
-
perl ファイルが開かない
-
XML::Parserの parsefileの結果...
おすすめ情報