Loading...

snow web site logo

お問合わせ
About us
Blog

Perlについて
老舗の言語のあれこれ

先月 last month  2025 年 04 月  来月 next month
日 sun月 mon火 tue 水 wed木 thu金 fri土 sat


12 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


Editer:snow Date:2025-04-01 21:22

複数画像をアップロードするにあたって注意点



引越し先のレンタルサーバーで開発をしていて、苦労をしています。
かなりね。(^-^;)
それで、メモ代わりに記事を書こうと思います。

まず、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 short URL いいね:0

月間アーカイブ
 ▼2021 年

 ▼2022 年

 ▼2023 年

 ▼2024 年

 ▼2025 年

↓