CGI-BBS > CGI > Perl > マルチパートで送信したテキストデータを取得したい


カレッヂ
カレッヂ


質問者 つくりん  投稿日 3/22(木) 18:03:34
こんにちわ!教えてください。
<form enctype="multipart/form-data" method="POST"〜で送信したテキストと画像データのうち、テキストデータの値を取得するにはどうすればいいのでしょうか?ファイルと同時に入力のデータも取得したいのです。どうか、よろしくお願いします。
回答者 まさ  [削除]  投稿日 3/22(木) 19:35:50
これにはPerl5の標準ライブラリーであるCGI.pmが使えます。

use CGI;

# データを受け取る
$query = new CGI;

# 画像データ
$file = $query->param('file');

# テキストデータ
$txt = $query->param('txt');

こうして画像(バイナリー)もテキストも混ぜて取得することが可能です。
CGI.pmは何も考えなくていいので便利です。

質問者 つくりん  [削除]  投稿日 3/22(木) 20:11:47
まささん、ありがとうございました。しかし、取得したデータはバイナリか何かわかりませんが送ったものと違うんです。どうしてでしょう?よろしかったら教えてください。
回答者 まさ  [削除]  投稿日 3/22(木) 20:22:19
ちょっと意味がよくわかりませんが、それはformで入力したデータとCGI.pmで受け取った
データが違うと言うことでしょうか?

ちょっと気になりましたが
><form enctype="multipart/form-data" method="POST"〜

これを
<form method="POST"〜
としても結果は同じになりますか?

ちなみにわたしは
<form method="POST"〜
としてCGI.pmでデータを受け取っていますけど、画像はちゃんと画像データとして、テキス
トはテキストデータとして受け取れていますけどね?

意味が違うのかな?

回答者 まさ  [削除]  投稿日 3/22(木) 20:33:40
もしかしたらこのことですかね?

use CGI;
@param = $query->param();

これで@paramをデコード処理してから値を取り出していませんか?
こうしてしまったら画像データは壊れてしまいます。
そもそもCGI.pmにデコード処理は不要です。
バイナリーとテキストを自動的にデコードしてくれますから。

わたしは全ての値を先に取得してから、テキストデータだけJcode.pmを使って文字コード
をセットしていますけど。

質問者 つくりん  [削除]  投稿日 3/22(木) 21:15:53
まささん、ありがとうございます。ですが、<form method="POST"〜でやっても結果は同じになります。何かいい方法はないでしょうか?

ちなみに以下の様にして結果確認をしています。

use CGI;

# データを受け取る
$query = new CGI;

# 画像データ
$file = $query->param('file');

# ファイルを書込む
open(FILE, ">123.gif");
print FILE $file;
close(FILE);

# テキストデータ
$txt = $query->param('txt');

# テキストデータを書き込む
open(LOG, ">> log.txt");
print(LOG "$txt\n");
close(LOG);
回答者 まさ  [削除]  投稿日 3/22(木) 23:20:10
申し訳ないです、上記ですと、ファイルの中身はファイル名になってしまいます。

># 画像データ
>$file = $query->param('file');

これを

# 画像データ
$filename = $query->param('file');
while(read($filename, $buffer, 2048)) { $file .= $buffer; }

こうすれば上手く行きます。

また<form>ですが、ENCTYPE="multipart/form-data"がないと上手く動きません。
こちらもややこしいことを言って、申し訳なかったです。

質問者 とこ  [削除]  投稿日 3/23(金) 11:48:28
まささん、親切に教えていただいてありがとうございます。今日は貫徹明けです。急いでたので違うやり方でやってしまいました。でも、まささんに様に親切にしていただいて嬉しく思います。本当にありがとうございました。

返信(回答)する


Web裏技