※ ChatGPTを利用し、要約された質問です(原文:ファイル名でなく、ファイルの中身を保存したい)
ファイルの中身を保存する方法について
このQ&Aのポイント
ファイルの中身を保存する方法について教えてください
テキストと画像を回答するHTMLで書かれたアンケートがあります。回答はPOSTメソッド、multipart/form-dataモードで送信されます。
perlで作成したCGIでテキストは正しく受信できましたが、画像がファイルの中身ではなくファイル名になってしまいます。画像ファイルを受信する方法をお教えください。
テキストと画像を回答する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;
}
お礼
回答ありがとうございます。 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バイト単位にファイルの中身を取得する ということですね。