ラウンジ(兼FAQ掲示板)

あんQで画像アップ式にするには
過去ログ NO.1169599722
□ ひろたか [2007年01月18日10時05分]
NXerさんへ
別スレにて書きましたがもう少し詳しくご質問させて頂きます。
当方の意向としましては、あんQにてアンケートを投稿の際に画像を添付でき○○の質問に対しての参考イメージといった感じでこの画像をみてどう感じましたか?○か×のようなアンケートが投稿できればより一層広がりをみせるのではないかと思いご質問させて頂きました。
また、アップロードできる画像のファイルサイズも指定する事ができスパム対策としてあとから不正な画像の際は画像を消去できるようにできれば有難いです。
宜しくお願いします。
□ NXer [2007年01月18日13時48分]

> 画像挿入し、その画像について
> 出来ません[2007年01月17日18時18分]

ソフトの新規開発は、当方も、すらすらできるわけではありません。
すえぽんさんのスクリプトでは、スパイ(現在では情報部員)が
暗号解読するように、1文字1行で立ち尽くしています。shadowも
すえぽん作品の典型です。解読するよりも、その画像添付機能
を使ってみてはどうでしょうか。NXerです。

*****************************************
すえぽんさん、ひろたかさん、皆さん
画像型アンケートは、あんQのテキスト型とほぼ同程度の新しい
概念のアンケートと考えています。
なお、テキストつまり ことば は、色、音、感触や連続する属性の
表現が本質的に苦手です。その点、画像は、色、形状や連続体をも
のによってはうまく表すことができます。認知に関する愚論は、ラ
ウンジの範囲を超える恐れがあり、以下改造愚案の提供をします。
不具合発生は当方の責任ではありません。
****************************************

例1 画像はshadowで送受信、表示する方式

あんQは変更しません。
あんQのテーマ欄です。
----------------------------------------------------------------
好きなアイスクリームは(掲示板記事2007 Jan 17 Wed 21:47:30 書込参照)
------------------------------------------------------------------

あるいは、質問項目欄です。

-----------------------------
バニラ(掲示板記事07/01/17 214730参照)
イチゴ(掲示板記事07/01/17 214745参照)
など
-----------------------------
アンケートに答えてみるのガイドには、掲示板を追加しておきます。

セキュリティについて。掲示板shadow には
---------------------------------------------------
nxer [localhost]
,,,,,,,,,,,,,,,,,,,
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
---------------------------------------------------
のように送信者のプロバイダと運用ブラウザ情報が表示
されることから、悪戯はかなり特定できます。そして、抑制されます。
記事削除機能がありますから、管理者ひろたかたさんは削除できます。

例2 shadow で画像の送受信して、画像を項目欄に表示する方式

その1) テスト用あんQ作成

現在運用中のanq.cgiで実験できますが、安全のために
anqphoto.cgi
という名前でテストしてください。

その2)タグ解除

通常はhtmlタグは禁止ですが画像表示のために解除します。
#でコメント化、非実行文にします。
138行目付近---------------------------------
# $value =~ s/<.*?>//g;# html 許可
----------------------------------------------

その3)好きな顔アイコンというテーマを作ります。

これが項目です。既存の顔アイコンで登録表示の練習です。
-------------------------------------項目に以下の入力をします。
顔1<img src=img/kao1.gif width=60 height=60>
顔2<img src=img/kao2.gif width=60 height=60>
以下略

なおテキスト顔1なしで画像だけの表示も試してください。
-------------------------------------------------------
同じことは、すでに作成されているどのテーマの後でもタグを
挿入するだけで画像を補うことができます。

ただし画像は、表示サイズの縦横比に、原画の縦横の比率が合う様な
画像処理をしたものとします。

メッセージには、テキスト(文字情報)、画像、URL、RSSなどの通信
情報などがあります。この中で、ネットでは、テキストメッセージ
は、文字コードでほぼ統一できます。しかし、画像は、.gif, .jpg
などの形式やサイズ、縦横比などの送信受信側で整合させる必要が
あります。信頼できる利用者と数度形式やサイズ違いの送受信、
画像表示テストをして、あんQに適切な値を模索してください。

これで通常のあんQを起動すれば、選択肢に文字と画像がでます。
表示にはタグ禁止のあんQでも問題ありません。
以上です。

**********************************************
以下はセキュリティと運用についてです。

タグは原則コメント改行用の<br>以外は不許可にしたほうが
セキュリティ上安全と愚考します。shadowは添付画像のmaxが
50kの上限ですが、アンケート項目欄の大きさに合わせて、
さらに小サイズで良いかもしれません。

画像付きアンケートは魅力的です。そのシナリオです。
イメージできたら試してください。

素材:
アイスクリームの画像5枚、各20kバイト以下。同一サイズ。
フルカラー、形式 .gif (.jpgもよい)

ソフト:
あんQ
shadow (あるいはメーラに添付)

利用者がアンケートを作成します。
(できれば信頼できる方に作成と次の画像送信を依頼します。)
--------------------------------
テーマ 好きなアイスクリーム

1 バニラ
2 チョコ
3 イチゴ
4 抹茶
5 ラムレーズン
--------------------------------
実際の運用では、画像(20kバイト程度)は、掲示板か、掲示板の
使い方が分からない方はメールで添付してもらいます。

ひろたかさんがタグを解除した anqphoto.cgi でそのテーマを選び
編集モードに入ります。

項目名のあとに次のようにタグを挿入する編集をします。
(文字数制限に注意)

1 バニラ<img src=img/vanilla.gif width=60 height=60>
他略

データが保存されれば、タグ禁止のanqでも利用者は画像が
表示されます。編集ができないだけです。

一方画像は、掲示板で添付されてたぶん
サーバのtmpファイルに保存されています。
/shadow/
...|-/temp/
..........|-vanilla.gif 画像をコピします。

/anq/
..|-/img/
......|-vanilla.gif 画像をペーストします。

これはサーバ上でFTPソフトウェアで簡単にできます。

ただし、このような画像アンケートが多くなると予想される時は

.../photo/
......|-vanilla.gif
.../img/

のように新たな別のディレクトリを作成します。
<img src=photo/vanilla.gif width=60 height=60>

直接shadowのディレクトリ配下の画像にアクセスする方法も
あります。
1 バニラ<img src=./shadow/temp/vanilla.gif width=60 height=60>
というアクセスも可能と思いますが、文字数制限を超える
かもしれません。

画像については著作権の問題があります。写メールなどが普及して
おり画像は溢れていますが、ウェブに掲載されると計り知れない影
響力があり、その掲載や管理については専門書/サイトで調べてくだ
さい。

多くの掲示板はスパム投稿で機能不全に陥っています。
shadowもスパム対策がしてない場合は、いずれスパム投稿が
溢れる恐れがあります。また、アクセスが数百を越す
とこころない人たちや興味本位で無用の画像を添付された
りします。いろんな形式のファイルで悪戯される恐れが有ります。
アクセス急増にともない、セキュリティ対策を強化して、
より安全な環境を整えてください。
□ ひろたか [2007年01月18日18時09分]
NXerさんへ
たびたびすみません。
せっかく回答いただきましたが、できればshadow掲示板を使わずしてあんQに組み込む事は出来ないでしょうか?
宜しくお願いいたします。
□ NXer [2007年01月21日12時00分]

画像ファイルを
>あんQに組み込む

には、次のような広い意味のアルゴリズムでできます。
以下の愚案、愚考はすえぽんさんの作品shadow.cgi(Free Soft
$ver = 2.06;$Last_Modified = '2002/12/19';)と Colorful
Board(フリーソフト$ver = 3.14 Last_Modified 2003/06/21)
を参考にさせていただきました。すえぽんさんに感謝申し上げます。
なお、運用上の不具合の発生の責任は当方にはありませんが、
考え方などの至らない点は補足してください。NXerです。

なお、以下の愚案にも関わらず、ファイルの添付については
セキュリティ上、脆弱性を内臓するために、shadowを介する
などの上記案や、仮に設置する場合も、登録に限って利用は信頼
できる会員制にするなどの運営での安全面も改造と同時にお考え
ください。

1)画像ファイル添付について

○テキストはurlエンコード
ネットでテキスト(文字列)をHTMLの入力フォームで送る時
データは、urlエンコード方式などでコード変換がされます。
受け取るcgiつまりperlのスクリプトでは、それ(テキスト)の
コードを読み解くスクリプトが必要です。デコード(decode)ルーチン
は、初期値設定の後、つまり、ウェブプログラムの最初にあります。

-----------------------------あんQ 100行目付近
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
else {
$buffer = $ENV{'QUERY_STRING'};

&jcode'convert(*value,'sjis');
$in{$par} = $value;
--------------------------------
htmlのメソッドPOSTは、長いデータの場合です。else とはGET形式
です。日本語のデータは、多くはsjisコードに変換します。

1.1 ○画像添付ファイルは、送信する時、バイナリファイルです。
改造する行です。
-----------------------------------------957
#■ print "<form action='$script' method=POST onSubmit='return lock()'>\n<table border>\n";
□print "<form action='$script' method='POST' enctype='multipart/form-data' onSubmit='return lock()'>\n<table border>\n";
--------------------------------------------------
970 print "<tr><td><b>アンケートテーマ</b>:</td><td><input size=50 name=subject><br>例)あなたの使っているOSは? 等</td></tr>\n";
#□---------------------------
print "<tr><td class=input valign=top>添付ファイル</td><td><input type=file name=file size=50><br>Max:50k_max_size</td></tr>\n";
#□-------------------------------------
print "<tr><td>投票項目:<
--------------------------------------------
↓のようにエンコード型をform-dataとします。POST形式が指定されています。
enctype='multipart/form-data'

送られたデータをデコードするには、画像がバイナリデータのために
上のスクリプトでは解読(decode)できません。上のデコードでは、
変換すると文字コードに当たる部分が文字になり画像になりません。

1.2 ○ デコードルーチンについて
そこで、shadowや他のファイル添付が可能なcgiのデコードルーチンを
参考にしてください。完成されてスクリプトですが、すえぽんさんの
作品はそれぞれ個性的なために、必ずしもあんQに利用できない恐れ
があります。当方はColorful Boardを利用させていただきました。
shadowにもありますから、次のような諸変数を探してみてください。
そして変更してみてください。

bin(ary)modeの標準入力を使う時の注意点。
--------------------------------これはほんの一部です。
if ($ENV{'REQUEST_METHOD'} eq "POST") {
□ binmode (STDIN);
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
----------------その他デコード部のキーワード
■$in{'filename'} = $filename;
□$in{'pfilename'} = $filename;
○$in{'file'} = $v
--------------------------------
あんQで $in{'filename'} とはデータのファイル名になります。
エラーを回避するために pfinename に変更しました。$in{'file'}が画像
ファイルです。

1.3 ○ 保存先と保存の諸変数と他のデータとの並び順

画像はtmpファイルに保存できないためにあらたにディレクトリを
作成します。
# 作業用画像フォルダ
$dir = "./anqphoto/";

画像ファイルは、anqphoto ディレクトリに保存します。
一方、画像ファイルの名前、例 dog.gif は
$in{'pfilename'}として取得されます。
その変数は、$pfilenameとして、split()に使います。
$valueに $in{'pfilename'}\, とします。
----------------------------------------------たくさんあります。
($subject,$lastmod,$pass,$limit,$ent_mode,$repost_mode,$name,$mail,$url,$pfilename,$mes,) = split(/\,/,$subject);
-----------------------------------------------類似の行は変更します。
$value ="$in{'subject'}\,$newnum\,$pass\,$limit\,$in{'ent_mode'}\,$in{'repost_mode'}\,$in{'name'}\,$in{'mail'}\,$in{'url'}\,$in{'pfilename'}\,$in{'mes'}\,\n";
-----------------------------------

2)画像ファイルの保存
------------------------------------
open(FILE,"> $dir/$in{'pfilename'}");
binmode(FILE);
print FILE $in{'file'};
close(FILE);
-----------------------------------
上のバイナリファイル保存を含むルーチンをshadowでみてください。
他のcgiでは sub reg(ist 登録)ルーチンに組み込んでありますが
あんQは、入力そして sub new_file { に進みますから、その
初めに
---------------------------
if ($in{'file'}) {
$size = length($in{'file'});
-----------------------------以下を挿入します。
試しに入力して、anqphotoには画像ファイル例 bara03.gifが保存され
tmpファイルのデータ内には、例 bara03.gifの名前があるか
みてください。ない時は、スクリプトエラーです。

-------------------------------
バラ,20070121094907,25555XLU,20070121,0,1,nxer,,,bara03.gif,04色..⇒紫
は交配がむずかしい(07/01/21)<br>05香り..⇒ハーブっぽいバラが好き(07/01/21)<br>,
--------------------------------

3)画像を表示するには

----------------------------326行
print "□ラジオボタンをチェックし投票ボタンをクリックします □投票した項目は点滅または背景色を変えて表\示します<br>\n";
print "□$repost<p>\n";
}#------------次の行で表示 サイズなど指定を追加してください。
if ($pfilename){print "<table><tr><td><img src=$dir/$pfilename></img></td></tr></table><br>\n";}#-------------------------
print "<table border>\n";
-----------------------------------------

上記の変更のために、mode=edit などの解読が post形式では
受け取れなかったために、get 形式にしました。
また、編集での引き継ぎは、$mes と同じようにhiddenで追加
してみました。

当方ではバラの花を表示してテストしていますが、考えうるすべ
てのものの色、質感、形態、デザインなどの属性をどのように人
は感じ、考えるか、を問う調査テーマは無限のように思われます。
あんQの可能性の拡大と同時に、ソフトの脆弱性も増大します。
いっそうのセキュリティ向上策を考えてください。
問題があるテーマは、テーマそのものを削除する
ことができます。必要なら削除機能を強化してください。

現在はサーチ・エンジンが、世界中で唯一つのデジタル情報
例、あんQ 画像添付 を2週間程度で索引化します。貴ソフト
が、あんQフォト、フォトあんQ(anqphoto,photoanq)などの
名前で検索される日が来ることをこころより祈念します。

□ ひろたか [2007年01月21日14時51分]
NXerさんへ
いつもながらご回答ありがとうございます。
結論からいいますと上手にできませんでした。
下記の箇所ですが
1.1 ○画像添付ファイルは、送信する時、バイナリファイルです。
改造する行です。
-----------------------------------------957
#■ print "<form action='$script' method=POST onSubmit='return lock()'>\n<table border>\n";
こちらに変更すると登録ボタンを押すと無条件で一覧画面へいきますがどこかに問題があるのでしょうか?
□print "<form action='$script' method='POST' enctype='multipart/form-data' onSubmit='return lock()'>\n<table border>\n";
続きまして、
bin(ary)modeの標準入力を使う時の注意点。
--------------------------------これはほんの一部です。
if ($ENV{'REQUEST_METHOD'} eq "POST") {
□ binmode (STDIN);
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
----------------その他デコード部のキーワード
■$in{'filename'} = $filename;
□$in{'pfilename'} = $filename;
○$in{'file'} = $v
はどういう事なんでしょうか?
2)画像ファイルの保存
の箇所ですが、sub new_file {の次に
if ($in{'file'}) {
$size = length($in{'file'});
if (! open(FILE,"> $dir/$in{'pfilename'}")) { &error("ファイルのアップロードに失敗しました"); }
binmode(FILE);
print FILE $in{'file'};
close(FILE);
}
を挿入すればいいのでしょうか?
宜しくお願いします
□ NXer [2007年01月21日18時14分]

早速試していただきありがとうございます。いろんな作品から
画像ファイル添付に必要な処理を、コピーペーストしています
ので原作はそちらでもダウンロードしてみてください。
基本的にはshadow.cgiのままでもいいはずですが、時間が
あれば、下記以外を研究してください。NXerです。

それぞれのルーチンを試すには、いくつかステップがあります。

まず入力メソッドの変更
□print "<form action='$script' method='POST' enctype='multipart/form-data' onSubmit='return lock()'>\n<table border>\n";
次に
971 print "<tr><td class=input valign=top>添付ファイル</td><td><input type=file name=file size=50><br>Max:50k_max_size</td></tr>\n";
の挿入で適当な.gif画像を選択した後、mode=new_fileが送信されます。
この場合、デコード部分は、改造したルーチンを期待しています。

>無条件で一覧画面へ

仮に、以前のままや不完全なものですと、mode=new_fileを読み取れず 
分岐で最後の&enter ルーチン、つまり一覧画面になります。スクリプ
トとしては正常な処理です。
form-dataを正しく正しく解読できるルーチンに変更すると
sub new_file ルーチンに進みます。

当方も、この状態で、五里霧中でした。そこで colorfulboard
で使っている cb3.cgi のデコード部に置き換えてみました。
#--------- by suepon 2003 これが、あんQphoto 用の試行版です。
if ($ENV{'REQUEST_METHOD'} eq "POST") {# post メソッドのみ有効
binmode (STDIN);#バイナリモード
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/Content-Disposition/i,$buffer);
foreach (@pairs) {
$key = "";
if ($_ =~ /Content-Type\:/i) {
($a,$v) = split (/Content-Type\:.*?[\r\n|\r|\n]{4}/,$_);
($a,$n,$b,$filename,$c) = split (/\"/,$_);
if ($filename =~ /\\/) { $key = "\\"; }
elsif ($filename =~ /\//) { $key = "\/"; }
if ($key) { $filename = substr ($filename,rindex ($filename,$key) + 1,length ($filename)); }
$in{'pfilename'} = $filename;#ファイル名を取得 pを付けて区別
}
else {
if ($_ =~ /name\=\"(.*?)\"/) { $n = $1; $v = $_; }
$v =~ s/.*?[\r\n|\r|\n]{4}//;
}
($v,$a) = split (/[\r\n|\r|\n]{2}\-{10,}/,$v);
if ($n eq 'file' && $filename) { $in{'file'} = $v;}#ファイルデータ
else {
$v =~ s/\r\n/\n/g;
$v =~ s/\r/\n/g;
$v =~ s/&/&/g;
$v =~ s/\"/"/g;
if ($n eq 'text' || $n eq 'title' || $n eq 'string' || $n eq 'bad_tag') {
$v =~ s/<!--.*?>//g;
$v =~ s/<>//g;
$v =~ s/</</g;
$v =~ s/>/>/g;
}
else { $v =~ s/<.*?>//g; }
&jcode'convert(*v,'sjis');
if ($n eq "del") { push(@DEL,$v); }
elsif ($n =~ /_l_/) { $l{$n} = $v; }
elsif ($n =~ /_s_/) { $s{$n} = $v; }
else { $in{$n} = $v; }
}
}
}
else {
$buffer = $ENV{'QUERY_STRING'};#GET メソッドデコード部
@buf = split(/&/,$buffer);
foreach (@buf) {
($n,$value) = split(/=/,$_);#以下アンQと同じ
$value =~ tr/+/ /; 
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/[\r\t\n]//g;
$value =~ s/[\t\n]//g;
#---------------------------permit to use tag <br> in comment
if (index($value,"<br>")<0)#他のタグは絶対禁止してください。
{$value =~ s/<.*?>//g;}
$value =~ s/\|/ /g;
$value =~ s/\"/\\"/g;
&jcode'convert(*value,'sjis');
$in{$n} = $value;
}
}
----------------------------------------

2)画像ファイルの保存
sub new_file {
#-----------------shadow.cgi by suepon 2002
if ($in{'file'}) {
$size = length($in{'file'});
$k_size = sprintf("%.2f",$size / 1000);
if ($size > $max_size) { &error("ファイルサイズが制限値を越えている為アップロードできません"); }
if (! ($in{'pfilename'} =~ /\./)) { &error("拡張子の無いファイルはアップロードできません"); }
$f_name = $in{'pfilename'}; $f_name =~ s/\.//;
if ($f_name =~ /[^\w|\-\_]/) { &error("ファイル名に禁則文字が使われている為アップロードできません"); }
$i = 1;
while (-e "$dir/$in{'pfilename'}") {
$in{'pfilename'} =~ s/\[.*?\]//g;
($f_name,$type) = split(/\./,$in{'pfilename'});
$in{'pfilename'} = "$f_name\[$i\].$type";
$i ++;
}
if (! open(FILE,"> $dir/$in{'pfilename'}")) { &error("ファイルのアップロードに失敗しました"); }
binmode(FILE);
print FILE $in{'file'};
close(FILE);
# if ($in{'pfilename'} =~ /\.gif|\.png|\.jpg|\.jpeg/i) { &get_scl($in{'pfilename'}); }#&get_sclはあんQにないために#で非実行文にします。
}
#----------------
以上です。

スクリプトの構成は上から下に次のようになっています。
--------------------------
[初期値設定]・・・・$dir を挿入
[デコードルーチン]・・・要改造 バイナリファイルデコードのため
[分岐ルーチン]・・・・・上の改造で$in{'mode'}の各値、例 edit, adreg,vote
            などを得ることができます。
[それぞれのサブルーチン]この内 
 [new_open]・・・・画像添付入力欄新設
[new_file]・・・・以下の内容で新しい、、、の画面になります。

さて、ここまで上手く変更できたら、各ボタンのメッソドが
postで動作するか確認してください。動作しない時はGETに変更
します。--------------------------------GETに変更、たぶんたくさんあります。
print "<form action='$script' method=POST>\n";

もちろん最も大切な、anqphoto に画像ファイルが保存されているか
tmphoto (作業用tmp名を変更しています)にできたデータに$mes
の前に、例 rose03.gif が保存されているかも確認してください。

anqphoto.cgi などの新しいファイル名で試行してください。
無限ループなどのおそれはありませんが、$pfilename, $in{'pfilename'}
変数の追加は、たくさんありますので、作業目的を明確にして改造
工事に取り組んでください。デバグできるように変更点をメモするなどして
正しく動作したら、別名で必ず、anqphotov1.cgiのように保存してください。

□ NXer [2007年01月21日23時00分]

ひろたかさんの関連スクリプトです。NXerです。
----------------------------------
else {
$buffer = $ENV{'QUERY_STRING'};# ○ getメッソドの情報
@buf = split(/&/,$buffer);#○ バッファ配列にa=1&b=2を&で分割
foreach (@buf) {#○バッファ配列の一つ一つについて
($par,$n,$value) = split(/=/, $pair);#●a=1の連想配列に分割する要素が
                  3つあります。
(略)
$in{$par} = $value;#○こちらの$parを正しいものとします。
-----------------------------------
●印の行の $n, を削除します。
--------------------------------
($par,$value) = split(/=/, $pair);#○名前=値の連想配列に分割する
--------------------------------
これで $in{'mode'}='vote' となり投票などに進むものと
思われます。

あるいは $nを残せば

 ($n,$value) = split(/=/, $pair)
 ↓
$in{$n} = $value;
の対応になります。
□ ひろたか [2007年01月21日23時05分]
NXerさんへ
ご回答ありがとうございます。
早速試してみたのですが、まだ上手く動作しません。
当方の現象としましては、新しくアンケートを作成でき画像も指定どおりアップロードできなおかつ表示もされますが、投票ぼたんや修正を行おうとすると一覧画面へ戻ってしまう処理をおこないます。
何かのエラーかとはおもいますいがどうすればいいでしょうか?
当方の分です。
if ($ENV{'REQUEST_METHOD'} eq "POST") {# post メソッドのみ有効
binmode (STDIN);#バイナリモード
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/Content-Disposition/i,$buffer);
foreach (@pairs) {
$key = "";
if ($_ =~ /Content-Type\:/i) {
($a,$v) = split (/Content-Type\:.*?[\r\n|\r|\n]{4}/,$_);
($a,$n,$b,$filename,$c) = split (/\"/,$_);
if ($filename =~ /\\/) { $key = "\\"; }
elsif ($filename =~ /\//) { $key = "\/"; }
if ($key) { $filename = substr ($filename,rindex ($filename,$key) + 1,length ($filename)); }
$in{'pfilename'} = $filename;#ファイル名を取得 pを付けて区別
}
else {
if ($_ =~ /name\=\"(.*?)\"/) { $n = $1; $v = $_; }
$v =~ s/.*?[\r\n|\r|\n]{4}//;
}
($v,$a) = split (/[\r\n|\r|\n]{2}\-{10,}/,$v);
if ($n eq 'file' && $filename) { $in{'file'} = $v;}#ファイルデータ
else {
$v =~ s/\r\n/\n/g;
$v =~ s/\r/\n/g;
$v =~ s/&/&/g;
$v =~ s/\"/"/g;
if ($n eq 'text' || $n eq 'title' || $n eq 'string' || $n eq 'bad_tag') {
$v =~ s/<!--.*?>//g;
$v =~ s/<>//g;
$v =~ s/</</g;
$v =~ s/>/>/g;
}
else { $v =~ s/<.*?>//g; }
&jcode'convert(*v,'sjis');
if ($n eq "del") { push(@DEL,$v); }
elsif ($n =~ /_l_/) { $l{$n} = $v; }
elsif ($n =~ /_s_/) { $s{$n} = $v; }
else { $in{$n} = $v; }
}
}
}
else {
$buffer = $ENV{'QUERY_STRING'};
@buf = split(/&/,$buffer);
foreach (@buf) {
($n, $value) = split(/=/,$_);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/[\r\t\n]//g;
$value =~ s/[\t\n]//g;
#$value =~ s/<.*?>//g;
if (index($value,"<br>")<0)
{$value =~ s/<.*?>//g;}
$value =~ s/\,/ /g;
$value =~ s/\"/\\"/g;
&jcode'convert(*value,'sjis');
$in{$n} = $value;
}
}
$cookie_name = $file = $in{'data'};

&get_cookie;
□ ひろたか [2007年01月21日23時51分]
NXerさんへ
原因はPOST→GETですね。
POSTをGETに変更して投票など機能するようになったのですが、今度は一度投票するとアップロードされた画像が表示されなくなります。
画像処理フォルダには画像はあるのですが、投票すると消えてしまいます。
このPOSTをGETに変更するとそういった現象がおきますが、、、
宜しくお願いします。
print "<form action='$script' method=post><BR><BR>\n";
print "<font color='white' size='1pt'>アンケートWORLDへようこそ  みんなは、どう思っている?そんな素朴な疑問をアンケートで解消!</font>\n";
print"<br><br>\n";
print "<img src='http://htk-system.com/enquete/images/a0208[1].gif'><A HREF=\"http://htk-system.com/enquete/\">トップ</A>\n";
print "<img src='http://htk-system.com/enquete/images/a0208[1].gif'><A HREF=\"http://htk-system.com/enquete/anq.cgi?mode=new_open\">新しいアンケートを作る</A>\n";
print "<img src='http://htk-system.com/enquete/images/a0208[1].gif'><a href='http://htk-system.com/enquete/anq.cgi?mode=end'>アンケート一覧へ</a>\n";
print "<img src='http://htk-system.com/enquete/images/a0208[1].gif'><A HREF=\"http://htk-system.com/enquete/kiyaku2.html\">利用規約</A><br><br>\n";
#print "<br><font color='red'>※当サイトをご利用頂ける方は、利用規約をご覧頂き同意頂ける方のみとさせて頂きます。</font>\n";
print "■投票開始:$file\n";
print "■投票終了:$limit\n";
print"</TD></tr></table>\n";
print"<P>\n";
print "<div style=\"font-size:$midashi\pt;font-weight:bold;\">■$subject</div>\n";
if ($pfilename){print "<table><tr><td><img src=$dir/$pfilename></img></td></tr></table><br>\n";}
print "<blockquote>\n";
#print "<table border bordercolor='#FF8000'><tr><td>\n";
#print "■登録者:$name<br>\n";
#print "■投票総数:$total<br>\n";
#print "■投票開始:$file<br>\n";
#print "■投票終了:$limit<br>\n";
#print "■最終更新:$lastmod<br>\n";
#print "■投票する項目のラジオボタンをチェックして投票ボタンをクリックして下さい<br>\n";
#print "■あなたが投票した項目は点滅または背景色を変えて表\示します<br>\n";
#print "<FONT color=Red>■公的秩序に反する書き込みをした場合、投稿者調査をさせて頂きます。</FONT><br>\n";
#print "<FONT color=Red>(管理者が不適切と判断した場合は、無許可で削除いたします。ご了承ください。)</FONT><br>\n";
#print "■$repost\n";
#print "</table></tr></td><p>\n";
print "<table border bordercolor='#FF8000'>\n";
$c = 0;
foreach (@sorted) {
$c ++;
($num,$content,$point,$color,) = split(/\,/,$_);
if ($point == 0) { $perse = 0; $len = 1; }
else {
$perse = $point / $total * 100;
$perse = sprintf ("%.2f",$perse);
$len = int ($point * $scl);
}

if ($vote_stop) { print "<tr><td width=40 height=25 align=center>$c</td>\n"; }
else { print "<tr><td width=40 height=25 align=center>$c</td>\n";
if ($scoreview<=0){
print "<td><input type=radio name=select value=$num></td>\n"; }
}
if ($last_cont eq $num) { print "<td bgcolor='$sel_bg' background='$pos'>"; }
else { print "<td>"; }


# ■ メッセージ表示 ■
if ($scoreview>=1){
print "$content</td><td align=right>$point</td>\n";
print "<td><table bordercolor='#FF8000' cellpadding=0 cellspacing=0 class=plain><td class=plain>";
print "<table cellpadding=0 cellspacing=0 bgcolor='$color' class=plain><td class=plain><img src='$grh' width=$len height=10></table></td></td>\n";
print "<td width=5 class=plain> </td><td class=plain>$perse\%</td></table></td></tr>\n";
}

else {print "$content</td>\n";}#■投票前結果非表示・項目名表示
print "</tr>\n";
}
# 背景色
$bgcol = "beige";
print "</table bordercolor='#FF8000'><br>\n";
if ($scoreview>=1){
print "<form action='$script' method=POST>\n";
print "<table><input type=hidden name=data value=1>\n";
print "<br><table bordercolor='#FFfcc'><input type=hidden name=urllat value=\"$in{'data'}\">\n";
#print "<td>■このアンケートについて <input type=submit value=' 満足した ' class=btn></td>\n";
#print "<td><input type=button value=' 満足しない ' onclick=location.href='$script' class=btn></td></form></table><br>\n";
print "<td>■アンケートを新しく投稿する場合は、こちらから⇒<input type=button value=' アンケートを作ってみる ' onclick=location.href='http://htk-system.com/enquete/anq.cgi?mode=new_open'>\n";
}
if ($scoreview>=1){
if ($msgflag<=0) {print "<form action='$script' method=POST>\n";
print "</table><table bordercolor='#FF8000' width=650 cellpadding='15'><td bgcolor='#FFE495' colspan=40 class=plain><font color='#6A001B'><img src='http://htk-system.com/enquete/img/off2.gif'><font size='4pt'><b> 最近のコメント </font></b><br><br>\n";
print "<border>\n";
print "<form action='$script' method=post>\n";
print "<input type=hidden name=data value=\"$in{'data'}\">\n";
print "<input type=hidden name=mode value=allmsg>\n";
print "<input type=submit value=' 全コメント ' class=btn ></form>\n";

}
else {print "</table><br><table bordercolor='#FF8000' width=650 cellpadding='15'><tr><td bgcolor='#FFE495' colspan=40 class=plain><font color='#6A001B'><img src='http://htk-system.com/enquete/img/off2.gif'><font size='4pt'><b> コメント一覧 </font></b><br><br>\n";
}
$len=length($mes);
$msgcount=0;
while ($len>0) {
$i=index($mes,">");
if ($i>0){
$msgcount++;
$mesunit=substr($mes,0,$i);
$mesunit=~s/⇒/<br>【コメント】/;
$icon=substr($mesunit,0,2);
$mesunit=substr($mesunit,2);
if ($icon eq "zz"){print "---$mesunit\n";}
else {$icon=$icon.'.gif';
print "<img src=$img$icon></img>$mesunit\n";}#gif 付加

$mes=substr($mes,$i+1);
if ($msgcount>20 && $msgflag<=0){$mes="";}
print "<br>\n"

}

else {$len=-1;}
}
print "</font></td></tr></table><br>\n";
}
if ($vote_stop) {
print "<tr><td colspan=4 class=plain>この項目への投票は終了しました</td></tr></form>\n</table>\n";
}
elsif (@sorted) {
print "<table bordercolor='#FF8000'>\n";
print "<input type=hidden name=mode value=vote>\n";
print "<input type=hidden name=data value=\"$in{'data'}\">\n";
if ($mesinput >=0){
if ($scoreview<=0){
print "<tr><td colspan=5 class=plain><table bordercolor='#FF8000' class=plain><td
class=plain><tr><td><img src='http://htk-system.com/enquete/img/off.gif'><font size='4pt'>【 コメントを書く 】</font><BR>(※全角100文字以内で内容、名前(匿名可)) <br>\n";
print "<textarea name=mes cols=40 rows=10 wrap=soft></textarea><br>\n";
print " ニックネーム <class=plain><input name=name2 size=20>※10文字以内<br>\n";
print "【顔アイコン】<br>\n";
print "コメント記入時にアイコンを付け加える事が出来ます。\n";

# ■ icon用 フォーム■
print "<center><input type=radio name=icon value=1><img src='./img/01.gif'>\n";
print "<input type=radio name=icon value=3><img src='./img/03.gif'>\n";
print "<input type=radio name=icon value=4><img src='./img/04.gif'>\n";
print "<input type=radio name=icon value=5><img src='./img/05.gif'>\n";
print "<input type=radio name=icon value=6><img src='./img/06.gif'>\n";
print "<input type=radio name=icon value=7><img src='./img/07.gif'></center><br>\n";
print "<center><input type=radio name=icon value=8><img src='./img/08.gif'>\n";
print "<input type=radio name=icon value=9><img src='./img/09.gif'>\n";
print "<input type=radio name=icon value=10><img src='./img/10.gif'>\n";
print "<input type=radio name=icon value=11><img src='./img/11.gif'>\n";
print "<input type=radio name=icon value=12><img src='./img/12.gif'>\n";
print "<input type=radio name=icon value=13><img src='./img/13.gif'></center>\n";

}
}

if ($scoreview<=0){
print "<tr><td colspan=5 class=plain><table bordercolor='#FF8000' class=plain><td class=plain><input type=submit value=' 投  票 ' class=red></font>\n";
print "<td colspan=5 class=plain><table bordercolor='#FF8000' class=plain><td class=plain><input type=submit value='コメントのみ書き込む' class=blue></font></td></form>\n";
print "<form action='$script' method=post>\n";
print "<input type=hidden name=data value=\"$in{'data'}\"></form></table></td>\n";

#print "<td class=plain><input type=submit value=' 更 新 ' class=btn></td></form></table></td></tr>\n</table>\n";

}
}
□ NXer [2007年01月22日14時48分]

>POSTをGETに変更して投票など機能する

画像添付ルーチンのみ、バイナリファイルのため POST メソッド
指定です。しかし、デコードはおそらく else 以下のGETメソッ
ドで 入力フォームの名前$n(ame) あるいは $par とその連想配列の
値$value を処理しているようです。NXerです。

>投票など機能する
ことから、当方の上の論理が異なるウェブサーバやプログラム
でも検証いただきありがとうございます。
これによって

>×今度は一度投票するとアップロードされた画像が表示されなくなります。
>○画像処理フォルダには画像はあるのですが、
>●投票すると消えてしまいます。
>?このPOSTをGETに変更するとそういった現象がおきますが、、、

というご質問の謎解きです。
----------------------------------------多分当方の313行付近
■print "<form action='$script' method=post><BR><BR>\n";
□print "<form action='$script' method=get><BR><BR>\n";#←この変更
print "<font color='white' size='1pt'>アンケートWORLDへようこそ 
-----------------------------
他にもPOST/postは、たくさんありますので不具合の発生をそれぞれ
確かめてください。

□ 欠くことのできない作業:作業用チェックリスト1
検索で
984 print "<form action='$script' method='POST' enctype='multipart/form-data'
のPOSTは除いて、一つ一つ確かめながらget/GETに変更します。

しかし、画像がアップロードされているのに表示されないという
原因は他のところにあります。これら不具合は、当方でも発生して
おり、常にモニタしてください。 

モニタ方法
--------------------------------
327行を項目は点滅または背景色を変えて表\示します<br>\n";
print "□$repost<p>\n";
}
if ($pfilename){print "<table><tr><td><img src=$dir/$pfilename></img></td></tr></table><br>\n";}
print "<table border>\n";
#◆----------------------------------
&header;print "☆ 変数モニタ中";print $pfilename;
#--------------------------------------------------------
↑上の行でモニタしています。

投票後にtmphoto内のデータファイルをエディタで見るとおそらく
ファイル名がなくなり ,, とコンマの間が空(null)になっている
と思います。

□ 欠くことのできない作業:作業用チェックリスト2 編集でも要チェック
これは投票ルーチンの例です。編集ルーチンにも応用してください。
-----------------------------------------------------
sub vote {#このルーチン内の添付ファイル変数名$pfilenameの受け継ぎ
795 ($subject,$lastmod,$pass,$limit,$ent_mode,$repost_mode,$name,$mail,$url,$pfilename,$mes,) = split(/\,/,$subject);

848 unshift (@new2,"$subject\,$newnum\,$pass\,$limit\,$ent_mode\,$repost_mode\,$name\,$mail\,$url\,$pfilename\,$mes\,\n");
open(WRITE,"> $tmp$file") || &error("[ $tmp$file ]が開けませんでした。");
--------------------------------------------
$url\,$pfilename\,$mes\,\n"); この部分は、コンマの前に\というエスケープ
文字があります。$url,$pfilename 全置換では,変更されていません。

□ 欠くことのできない作業:作業用チェックリスト3
編集ルーチンでは、以前評価ポイントやコメントを継承できなかった
問題が発生すると思われます。その時の手順を過去ログでみなおしてくだ
さい。

□ 任意の作業です。
テーマ設定後の確認一覧にも画像名と画像を表示するようにしてみました。
------------------
1127 print "<tr><td>アンケートテーマ</td><td>$in{'subject'}</td></tr>\n";
#--------------------------------------------------------
print "<tr><td>添付画像名</td><td>$in{'pfilename'}</td></tr>\n";
if ($in{'pfilename'}){print "<tr><td>添付画像</td></tr><tr><td><img src=$dir/$in{'pfilename'}></img></td></tr>\n";}
#---------------------------------------------------------
print "<tr><td>投票項目:<td>\n";

なお、編集でも画像ファイルを編集できるようにすると、変更後の新しい
画像ファイル添付機能を付けることになりプログラムを複雑にしそうです。
そのために、hiddenで引き継ぐほうが良いと思います。本当に
変更したい時は、テーマを削除して、新たにテーマ作成したほうが
確実な気がします。

□ 削除したファイルで利用した画像ファイルの削除、ハードディスク
の領域を確保するために欠くことのできない作業です。

------画像削除のために、ファイル名の継承をhidden typeでしておきます。
677 print "<form action='$script' method=GET onSubmit='return check(\"このテーマの削除\")'>\n<td class=plain>\n";
print "<input type=hidden name=mode value=delfile>\n";
print "<input type=hidden name=data value=\"$in{'data'}\">\n";
#---------------------次の1行挿入
print "<input type=hidden name=pfilename value=$pfilename>\n";
print "<input type=submit value='このテーマの削除' class=red></td></form>\n";
-----------------unlink()関数でファイルの削除をします。
sub delete {
#■if ($in{'mode'} eq 'delfile') {unlink "$tmp$file";&enter; exit; }
if ($in{'mode'} eq 'delfile') {unlink "$tmp$file"; unlink "$dir$in{'pfilename'}";&enter; exit; }
--------------------------------
以上です。
************************************
実際の運用論は、ラウンジの枠を超えるかもしれません。
生命や健康(ダイエットや医療行為、治療行為まがいのアンケート)
財産、法律、深刻な人生相談アンケートなどは利用規定で触れている
と思います。
仮称あんQフォトでは、画像の著作権問題があります。
メルアド入力を必須にするなどして、画像の著作権が投稿本人に帰属する
こと、あるいはフリー素材(できれば著作権者表示)の使用することを保
証する手立てが必要と愚考します。
また、サイズの標準化のためにあんQの表示画像例が考えられます。
バラで試しましたが、1本のバラです。これを3本にしてそれぞれに
A、B、Cとするには、HP作成ソフトで3列3行の表を作り、上にA,B,C
真ん中の3列に画像、下の列にはたとえばバラの名前を、エリザベス
モンテクリスト、モンブランのように入れます。その画像をprint
screen で取得して、制限バイト(50Kまたは20K程度)内に縮小編集
します。それを添付すれば、1枚の画像でアンケートをとることがで
きます。アンケートを作るページに、適切な画像枠、A,B,Cなどを
書き込んだテンプレートを数種掲載して利用してもらうといいかも
しれません。20K100枚で約2メガ、50Kで5メガ。サーバのメモリ
サイズから、適切なMAXサイズを算出します。
テキストアンケートとは、まったく別の画像アンケートの世界に
道しるべを付けてください。
□ ひろたか [2007年01月22日16時12分]
NXerさんへ
お陰さまで組み入れる事ができました。
現在、不具合などないか調査中ですが、一つ気になる点がございます。
現在の仕様だと表示はされないがどんな形式のファイルでも添付されてしまいます。表示はされませんが。。。
ウィルスファイルなどの悪用される恐れがある為、誠に申し訳ないですが、画像ファイルだけに制限する事はできますでしょうか?
いつも当方の勝手きままな質問にも懇切丁寧にご回答いただき誠に有難うございます。かさねがさねお礼申し上げます。
また、最後になりますがあんQ原作者のすえぽんさん、当方の勝手気ままに改造する為とはいえラウンジをいつも快く利用させて頂き誠に有難うございました。
ますますの発展お祈り申し上げます。

□ NXer [2007年01月22日20時16分]

>画像ファイルだけに制限する
には

1034-------------------
sub new_file {
if (!($in{'pfilename'} =~ /\.gif|\.jpg/i)) { &error("画像ファイルは、拡張子を .gif か .jpgで添付してください。");}
------------------------
↑この1行挿入してお試しください。

以上です。
*************************************************謝辞

>質問
がなければ、無料のあんQに潜んでいる無量(どれだけあるのか、よくわから
ない)の可能性に気づくことはなかったと思います。当方こそ、ひろたかさん、
原作者すえぽんさんに、その可能性の一端に触れさせていただいたことを限り
なくうれしく思います。愚論愚考妄想を掲載していただいたり、また、お試し
いただいたりしたことに、こころから感謝いたします。
many thanks. NXer.
□ ひろたか [2007年01月23日11時11分]
NXerさんへ
早速、添付ファイルの件を組み込んでみました。
そこでもう1件、お聞きします。
当方では、画像アップロードの修正もできるよう訂正ページにもあるのですが、新規作成時にはエラー画像ファイル以外はダメとエラーメッセージが表示されますが修正ページでは通り抜けてしまいます。回避方法ありますでしょうか?
宜しくお願いします
□ NXer [2007年01月23日16時16分]

>画像アップロードの修正も

そのスクリプトは不明なために、以下は当方の試行版です。
参考にしてください。NXerです。

作業その1)画像ファイルなのでpost enctype=,,,に変更。ファイル参照欄追加

580#-------------------------------------------------------◆ post enctype変更
#■ print "<form name=form action='$script' method=GET>\n";
print "<form name=form action='$script' method=POST enctype='multipart/form-data'>\n";
print "<table border>\n";
print "<input type=hidden name=data value=\"$in{'data'}\">\n";

(略) 下を残してさらに追加 
print "<tr><td>添付ファイル名:</td><td><input size=50 name=pfilename value=$pfilename></td></tr>\n";

#□---------------------------追加する行
print "<tr><td class=input valign=top>添付ファイル</td><td><input type=file name=file size=50 ><br>Max:50k_max_size</td></tr>\n";
#-------------------------------------
print "<tr><td>更に追加する項目:</td><td><input size=50 name=content></td></tr>\n";
---------------

作業その2)ファイルの転送をサブルーチン化する

編集後は登録ルーチンに進むため、そこでもファイル転送が必要になります。
元のnew_fileのスクリプトをファイル転送用に新たにサブルーチン
sub photo_file { }
を創設してそれを通します。これで gif, jpg ファイル形式以外はエラー処理されます。

2.1 登録ルーチンの変更
---------------------
697 sub regist {
#---------------1行挿入
&photo_file;
#-----------------
open(READ,"$tmp$file") || &error("[ $tmp$file ]が開けませんでした。");
@lines = <READ>;

2.2 new_file ルーチンでは以下のように、もとの転送部分をサブルーチンに
して、その代わりに&photo_file;# を挿入します。
-------------------------
1041 sub new_file {
&photo_file;#挿入
$mesnew=$in{'name'};&antispam;
$mesnew=$in{'subject'};&antispam;
--------------------------------

作業その3)ファイル転送サブルーチンの作成

sub photo_file {
#-----------------shadow.cgi
if (!($in{'pfilename'} =~ /\.gif|\.jpg/i)) { &error("画像ファイルは、拡張子を .gif か .jpgで添付してください。");}
(略)
binmode(FILE);
print FILE $in{'file'};
close(FILE);
# if ($in{'pfilename'} =~ /\.gif|\.png|\.jpg|\.jpeg/i) { &get_scl($in{'pfilename'}); }
}
}
-------------
作業その4)契約サーバの容量で節約設計の場合は欠くことのできない作業です。

さて、添付ファイルを変更することは次のような複雑な処理が付随しまう。
ウェブサーバで使用できるディスクサイズに制限があることから
元画像ファイル(20K)
新画像ファイル(20K)
のように、元を削除しないと20Kが無駄になります。大きな容量であれば
少ないと思われる修正元画像ファイルは問題ありませんが、管理人が削除
するのは特定化するだけでも大変です。
最小限度の対策愚案です。
4.1------------------------------
597 print "<tr><td>添付ファイル名:</td><td><input size=50 name=pfilename value=$pfilename></td></tr>\n";
#□-------------------------元ファイル名の代入、不可欠な行
$oldpfilename=$pfilename;
#---------------------------
さらに
4.2---------------------repost=$oldpfilenameとして送信
print "<input type=checkbox name=repost value=1>再投票防止モード初期化する\n";
677 print "<input type=checkbox name=repost value=$oldpfilename>画像を変える</td></tr>\n";
print "</form></table><p>\n<table class=plain><td class=plain>\n";

#------------------$in{'repost'}としてデコードした元ファイル名を削除
700 sub regist { #unlink()で元画像ファイル削除
if ($in{'repost'}){unlink "$dir$in{'repost'}";}
#---------------
&photo_file;
#-----------------
cgiでは一種の伝言ゲームです。どのような入力フォームを使えばよいのか
は、プログラマによって異なると思いますが、最小限の変更でチェックボッ
クスを使いました。利用の手引きで添付画像の編集時は、「画像を変える」に
チェックを入れて「編集」ボタンを押す、ことを追加してください。
以上です。
***********************************************************
すえぽんさん、皆さん、改造愚案のフォローのためラウンジ枠外となり
ますが、ご理解ください。NXer.

suepon.com | CGI作成/CGI制作 | JavaScript | ドメイン検索 | バナー自動作成 | Google ダンスツール | 松浦亜弥 | H.P.memo | パソコン | ネイル

Copyright (C) 2002 - 2008 suepon , All rights reserved. Powered by CGI Script Market.