トップページ >Perlについて
ブログ
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Perlについて
2025-04-01 21:22:04 *複数画像をアップロードするにあたって注意点*
引越し先のレンタルサーバーで開発をしていて、苦労をしています。
かなりね。(^-^;)
それで、メモ代わりに記事を書こうと思います。
まず、Perlのバージョン5.26で開発をしていますが、
バージョンを下げても、あまり効果が無く、数日が過ぎました。
Perl ver5.26
CGI.pm ver3.63
CGI::Carp ver3.51
Image::Magick::Q16 ver6.9.12
でも、なんとか複数画像をアップロードできるまでになりましたので、書き添えたいと思います。
CGI.pmをuseして、尚且つ、Image::Magickもuseしています。
開発の途中で、下記のように書くと、普通のエラーを捕捉してログを出力してくれるのでかなり助かりました。
BEGIN {
use CGI::Carp qw(carpout);
open(LOG, ">>","../your/path/file_nm.log") or die("Unable to open mycgi-log: $!
");
carpout(LOG);
close(LOG);
}
Perl ver5.26だと、Kcacth.pmが全く使えなくて、500サーバーエラーだけしかわからなくて苦労しました。
あと、BEGIN以下に、以下のように書くと、エラーをKcacth.pmのように補足してブラウザで表示してくれます。
use CGI::Carp qw(fatalsToBrowser);
それから、CGI.pmでインスタンスを生成した後、ファイルハンドルを得なければいけないことがわかりました。
my $cgi = CGI->new;
my @filenames = $cgi->param("imges");
my @filehandles = $cgi->upload('imges');
今までは、パラメータで渡されたファイル名だけで、アップロードまでできていたのですが、現行のバージョンですとそれができません。
アップロードで、ファイルハンドルを得て、ファイルテスト演算子「-s」などで、ファイルサイズ確認が取れました。
my $file_size = 0;
my $files_size = 0;
my $file_nm = "";
foreach my $file(@filehandles){
if(-e $file){
$file_size = -s $file;
$files_size = $files_size + $file_size;
$file_nm .= "$file ";
}
}
ファイルの拡張子を調べたりするときは、パラメータ渡しで得た値の方を使いました。
※&errorサブルーチンは独自に用意したものです。
($fname,$ext) = $file_nm =~ /([^:/]+).(w+)$/ ? ($1,$2) : "file select error! $!";
#受付可能な拡張子(正規表現)
@ext_ok = ("gif", "jpeg", "jpg", "png");
unless (grep {$ext =~ /^$_$/i} @ext_ok){ #どれにも合致しなければ
&error("許可されていない拡張子($ext)です。");
}
Image::MagickでReadする時に、下記のように指定して上手くいきました。
$upfileが、先ほどuploadで得たファイルハンドルです。
上手く読み込めないと、$retにエラーの内容が入ります。
$image = Image::Magick->new;
$ret = $image->Read(file => $upfile);
my $fname_min = "$img_dir$fname.$ext";
$ret = $image->Write($fname_min);
今回、複数画像を縮小してアップロードしていたので、Image::Magickを使いましたが、下記の方法でもアップロードできます。
my $size = 1024*1024*20;
my @filenames = $cgi->param("imges");
my @files = $cgi->upload('imges');
foreach my $filehandle(@files){
my $filename = shift(@filenames);
# 保存先のパスを指定
my $img_dir = "../path/";
my $img_path = $img_dir . $filename;
# ファイルを開き、保存
my $buffer;
opendir(DIR1,$img_dir) or die "Cannot open $img_dir: $!";
open (OUT, '>', $img_path) or die "Cannot open $img_path: $!";
binmode OUT;
while (my $bytesread = read($filehandle, $buffer, $size)){
print OUT $buffer;
}
close(OUT);
closedir(DIR1);
}
出典「JPSM - Perlでファイルアップロードをマスターする15のサンプルコード」
Twitter
copyURL
いいね:8 back to the TOP |