こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ファイル名でなく、ファイルの中身を保存したい

テキストと画像を回答するHTMLで書かれたアンケートがあります。回答は、
<form name="a" method="post" action="cgitest.cgi" enctype="multipart/form-data">
つまり、POSTメソッド、multipart/form-dataモードで cgitest.cgi に回答を送ります。

perlで作成したCGIでテキストは正しく受信できましたが、画像がファイルの中身ではなくファイル名になってしまいます。画像ファイルを受信する方法を教えてください。
なお、CGIには、画像ファイルのバイナリデータも送信されていることは、別途C言語で記載した確認プログラムで確認済みです。


----HTML----
<!DOCTYPE html>
<html lang="ja-JP">
<head>
<meta charset=Shift_JIS>
</head>
<body>
<form name="a" method="post" action="cgitest.cgi" enctype="multipart/form-data">
氏名 : <input type="text" name="ans1">
困ったときの写真:<input type=file name="ansfig1" onChange="this.form.disp.src=window.URL.createObjectURL(this.files[0])">
<br><img name=disp>

<input type="submit" value=" 送信 ">
<input type="reset" value=" 取消 ">
</form>
</body>
</html>

----CGI-----
#!"D:\lib\xampp\perl\bin\perl.exe"

use CGI;
my $q = new CGI;

#フォームからのデータ読み込み
my $ans1 = $q->param('ans1');
my $fig1 = $q->param('ansfig1');

$ans1file = 'ans1.txt';
open(OUT, ">$ans1file") or die "$!";
print OUT $ans1;

$ans2file = 'ans2.jpg';
open(OUT, ">$ans2file") or die "$!";
print OUT $fig1;

---- 参考 CGIに渡されるデータ確認用 ---------
#include <stdio.h>
#include <fcntl.h>
#include <io.h>

int main(void)
{
int c;
FILE *fp;
fp = fopen("temp.dat","wb");
setmode(fileno(stdin), O_BINARY);
while((c=fgetc(stdin)) != EOF ) {
fputc(c,fp);
}
fclose(fp);
return 0;
}

投稿日時 - 2014-08-06 23:56:18

QNo.8707227

困ってます

質問者が選んだベストアンサー

CGI.pmのマニュアルに書いてあると思います。
http://search.cpan.org/dist/CGI/lib/CGI.pm#Processing_a_file_upload_field
和訳:
http://perldoc.jp/docs/modules/CGI-3.49/CGI.pod#PROCESSING32A32FILE32UPLOAD32FIELD

CGI.pmはアップロードされたファイルを一時的にファイルに保存し、$q->uploadでそのファイルのハンドルを取れるようにするようです。

投稿日時 - 2014-08-07 20:29:36

お礼

回答ありがとうございます。
my $fig = $q->param('ansfig');
では、ファイルの中身ではなくファイル名が取得されるのですね。

>$q->uploadでそのファイルのハンドルを取れるようにするようです。
ファイルの中身を取得するには、ファイルアップロード用の IO::Handle 互換のハンドルを
$lightweight_fh = $q->upload('ansfig');
my $io_handle = $lightweight_fh->handle;
で取得して、
 $bytesread = $io_handle->read($buffer,1024)
で1024バイト単位にファイルの中身を取得する
ということですね。

投稿日時 - 2014-08-08 04:29:01

このQ&Aは役に立ちましたか?

12人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問