perlに詳しい方

htmlのフォームから送信されたデータを、htmlファイルとして保存できるようにしようと考えています。
次の条件でお願いします。
1.ファイルを作成したあと、フォームに入力された内容の他に<html>、<body>、</body>、</html>タグ等が入る
2.(フォームの内容)+.html で保存する
回答よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2012/02/10 22:24:46
  • 終了:2012/02/12 13:45:50

ベストアンサー

id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492012/02/11 01:35:39

print の出力先を指定することでファイルに出力されます
ファイルに書き出す場合には、チェックすべきことがいろいろあるので、コードは少し長くなります
(ほかにも色々あるのですが、最低限に絞っています)

# CGIライブラリの準備
use CGI;

# 初期化
$query = new CGI;

# ファイル名設定
$filename = "sample.html";

# ブラウザへの出力
print $query->header;

# ファイルがすでに存在したらOh! No!を出力してプログラム終了
# 強制的に新しい内容に書き換えてもいいなら、ここは不要
if (-e $filename) {
    print "Oh! No!";
    exit;
}

# ブラウザではなくファイルへ出力
open(fh, ">$filename") or die("File Output Error");
print fh $query->start_html;
print fh $query->start_form(-action=>'URLを入れる' ,-method=>'post');
print fh $query->textfield(-name=>'n1', -default=>$query->param('n1'));
print fh $query->textfield(-name=>'n2', -default=>$query->param('n2'));
print fh $query->textfield(-name=>'n3', -default=>$query->param('n3'));
print fh $query->end_form;
print fh $query->end_html;
close(fh);

# 作成したファイルのパーミッション設定
# Windows上で動かす場合は不要
# Windows以外で、これを忘れると後から見れなかったり修正できなかったりする
# 0644 の部分はサーバーによる
chmod(0644, $filename) or die("Permishion Change Error");

# ブラウザへ正常終了を表示
print "congratulations";
他2件のコメントを見る
id:windofjuly

変更です
print $query->header;

print $query->header(-charset=>'Shift_JIS');

2012/02/12 11:38:51
id:hiroto300

うまく日本語で表示させることが出来ました。
ありがとうございます。

2012/02/12 13:45:24

その他の回答(1件)

id:uwao No.1

uwao回答回数170ベストアンサー獲得回数362012/02/11 01:18:53

下記で動作すると思います。
クロスサイト スクリプティング脆弱性に対応するため、パスワード制限をかけています。
パスワードを知らせるのは、ご自身か自社の方など、確実に信用出来る人だけに限定する必要があります。
WEBから多くの人に送信させたい場合は、HTMLタグを無効にするような対応が必要です。
 
HTMLページ
<FORM action="hoge.cgi" method="post">
HTML:<INPUT type="text" name="HTML"><BR>
Filename:<INPUT type="text" name="filename"><BR>
PASS:<INPUT type="password" name="PASS"><BR>
<INPUT type="submit" value="送信">
</FORM>
 
hoge.cgiはこんな感じ
 
#!/usr/bin/perl
$password = '12345';
read(STDIN, $buff, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/,$buff);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$in{$name} = $value;
}
print "Content-type:text/html\n\n";
print "<html><body>\n";
if($in{'PASS'} eq $password){
$htmlfile = $in{'filename'}.'.html';
open HOUT,">$htmlfile";
print HOUT "<HTML>";
print HOUT "<HEAD><TITLE>タイトル</TITLE></HEAD>\n";
print HOUT "<BODY>\n";
print HOUT $in{'HTML'};
print HOUT "<BODY>\n";
print HOUT "</HTML>\n";
close HOUT;
print "HTML作成完了!\n";
}else{
print "パスワードが違います!\n";

}
print "</body></html>\n";
exit;

id:hiroto300

ありがとうございます。

2012/02/11 12:15:24
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492012/02/11 01:35:39ここでベストアンサー

print の出力先を指定することでファイルに出力されます
ファイルに書き出す場合には、チェックすべきことがいろいろあるので、コードは少し長くなります
(ほかにも色々あるのですが、最低限に絞っています)

# CGIライブラリの準備
use CGI;

# 初期化
$query = new CGI;

# ファイル名設定
$filename = "sample.html";

# ブラウザへの出力
print $query->header;

# ファイルがすでに存在したらOh! No!を出力してプログラム終了
# 強制的に新しい内容に書き換えてもいいなら、ここは不要
if (-e $filename) {
    print "Oh! No!";
    exit;
}

# ブラウザではなくファイルへ出力
open(fh, ">$filename") or die("File Output Error");
print fh $query->start_html;
print fh $query->start_form(-action=>'URLを入れる' ,-method=>'post');
print fh $query->textfield(-name=>'n1', -default=>$query->param('n1'));
print fh $query->textfield(-name=>'n2', -default=>$query->param('n2'));
print fh $query->textfield(-name=>'n3', -default=>$query->param('n3'));
print fh $query->end_form;
print fh $query->end_html;
close(fh);

# 作成したファイルのパーミッション設定
# Windows上で動かす場合は不要
# Windows以外で、これを忘れると後から見れなかったり修正できなかったりする
# 0644 の部分はサーバーによる
chmod(0644, $filename) or die("Permishion Change Error");

# ブラウザへ正常終了を表示
print "congratulations";
他2件のコメントを見る
id:windofjuly

変更です
print $query->header;

print $query->header(-charset=>'Shift_JIS');

2012/02/12 11:38:51
id:hiroto300

うまく日本語で表示させることが出来ました。
ありがとうございます。

2012/02/12 13:45:24
  • id:TransFreeBSD
    時間ないのでコメントで。
    フォームに入力した内容をそのまま表示したり、ファイル名に使ったりすると、uwaoさんの言うようにクロスサイトスクリプティングやディレクトリトラバーサルと言った脆弱性が出来てしまいます。なので場合に応じて色々チェックしたり、処理をしたりする必要がでてきます。
    あと、ファイル名には使える文字使えない文字もあります。
    なので、Windowsだけで動かす(確かそうでしたよね?)のか。自分だけが使えるようにするのか。といったところも明かにするといいかも。
    あとは、再編集とか考えると、内容はテキストファイルで保存して、表示の時にCGIでHTMLに変換とかすることが多いです。
    (効率化のためにHTMLファイルも保存とかはあります。今時はデータベース使うのが多いですけど)

    長々書いてもあれなんで最後に。
    yukiwikiと言うのを探してみてください。やりたいことに結構近いかも知れません。
    (実践的なので色々複雑かもしれませんけれど)
    あと、作者の結城さんの本も探してみてください。
    古いので古本屋さんにもあるかも知れません。
    webサイトも参考になると思います。
  • id:TransFreeBSD
    YukiWikiMiniなら小さいですね。200行だそうです。
    http://www.hyuki.com/yukiwiki/#YukiWikiMini
    「YukiWikiMiniは、 日本語リンク、検索、更新情報なども入っていない、最もシンプルなWikiです(約200行)。 スクリプトを読んだり、自分オリジナルのWikiを作るための研究材料にどうぞ。」
  • id:hiroto300
    windowsだけで動かします。
    次から書いておきます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません