CGI-BBS > 電子掲示板 > 簡易BBS > 参照ボタンからファイルをオープンさせて画像を添付するには


カレッヂ
カレッヂ


質問者 yoko  投稿日 4/19(木) 12:49:22
初心者なので簡単なのか難しいことなのか良く分からないのですが、
フォームに参照というボタンを作って、クリックするとデスクトップのファイルがオープンして
そこから画像を選択して、画像を添付して送ってもらえるようにしたいのですが、
どうしたらボタンをクリックするとファイルオープンさせられて、画像が添付できるようになるのでしょうか????
簡単に教えてくださーい!!!
回答者 呑兵衛  [削除]  投稿日 4/20(金) 17:14:27
呑兵衛といいます。

フォームではボタン操作はtextのみにしておいた方が複雑にならずにすむと思います。
フォーム部分のHTMLに最初から画像を貼り付けておいて、
その画像に対応するファイル名を添付し、
フォームでは<option>以下に対応画像ファイル名を選択できるようにする
ことが最も手っ取り早いのでは。
回答者 呑兵衛  [削除]  投稿日 4/20(金) 17:41:42
意味を取り違えていました。すみません。

つまり、投稿者側にある画像ファイルの添付をする、という意味ですね。
それなら、
<input type=file name="gazou" size=60>
の行をフォームに挿入し、受取る cgi に gazouに対応する変数の指定をすればおしまいです。

参照というボタンは type=file で出てきます。
質問者 yoko  [削除]  投稿日 4/20(金) 19:11:19
呑兵衛さん、どうもありがとうございます。
とっても恥ずかしいです・・・。
その、cgiに指定する変数って、何のことですか???
よかったら教えてもらえませんか?お願いします。
回答者 呑兵衛  [削除]  投稿日 4/20(金) 20:45:32
このサイトの 簡易BBSエクセレント があなたの要求を満たすと思います。

フォームの枠が指定されている場所は、それぞれそこに任意の文字や画像
が指定されてもいいように、枠毎にそれに見合った変数が定義されます。
文字を表すなら <input type=text name="kotoba">
ラジオボタンを表示するなら <input type=radio name="seibetsu">
画像やデータファイルなら<input type=file name="file">
など。

CGIはフォームから送られてくる情報を、それぞれの変数に代入し処理します。
たとえば上の例ではCGIには送られてきた文字列を
$FORM{'kotoba'} とか $FORM{'seibetsu'} $FORM{'file'}などで受け入れ、
ここで何かの仕分けを行います。
最終的には、HTMLに出力する材料にしたり、そのまま記録したりします。
if ($FORM{'file'} = 'gazou.gif') { print "gazou.gif"; } など、かな。
回答者 まさ  [削除]  投稿日 4/20(金) 21:36:39
>CGIはフォームから送られてくる情報を、それぞれの変数に代入し処理します。
>たとえば上の例ではCGIには送られてきた文字列を
>$FORM{'kotoba'} とか $FORM{'seibetsu'} $FORM{'file'}などで受け入れ、
>ここで何かの仕分けを行います。

%FORMをどういう風にデコードしているのかわかりませんが、通常このような方法では無理
です。テキストデータとバイナリーデータを同時に扱うことはできません。

>最終的には、HTMLに出力する材料にしたり、そのまま記録したりします。
>if ($FORM{'file'} = 'gazou.gif') { print "gazou.gif"; } など、かな。

これでは画面上に「gazou.gif」と出るだけです。画像自体は出力されません。

画像をアップロードしたいのならば通常CGI.pmを使います。
これを使ってやるとテキストとバイナリーを同時に扱うことができます。
サンプルは以下のページを見てください。

http://www.harukaze.net/~mishima/perl/module/upload_by_CGI_pm.html

CGIの最初に

use lib './lib'; # util.libを格納しているディレクトリ
use CGI;
require 'util.pl';
use File::Basename;

こういうのがありますが、上手く書けば
use CGI;
だけでOKです。CGI.pmはPerl5標準のライブラリーですから、Perlが5以上ならば問題なく
使えます。

ポイントは
<FORM ACTION="xxx.cgi" ENCTYPE="multipart/form-data" METHOD="POST">
のENCTYPE="multipart/form-data"です。これを書かなければ画像はファイル名になって
しまいます。

回答者 まさ  [削除]  投稿日 4/20(金) 21:51:02
極端な話以下でも動くと思います。

use CGI;

$query = new CGI;

$filename = $query->param('File');
while(read($filename, $buffer, 2048)) { $file .= $buffer; }


# ファイルをコピー
open(OUT, "> $filename");
binmode(OUT);
print(OUT $file);
close(OUT);

回答者 呑兵衛  [削除]  投稿日 4/21(土) 01:21:09
まささん、応援ありがとうございます。

cgiに指定する変数のみ、前後をめちゃくちゃ端折って単純に書いたもので
いたずらに混乱させたみたいですね。失礼申しました。

返信(回答)する


Web裏技