이 펄 스크립트는 서버에 이미지를 업로드 한 후 저장합니다 - 900x900 픽셀 에 맞는 갤러리 이미지 - 사각형 갤러리 축소판 140x140 픽셀 을 - js 파일에 이미지 및 축소판 이름이있는 행을 추가합니다.내부 서버 오류가
문제는 스크립트가 가끔 작동한다는 것입니다. 그것은 매 10 번의 시도 중 하나 또는 두 번에서 잘 작동합니다. 작동하지 않으면 일반적으로 "내부 서버 오류"를 반환하고 두 파일을 만들지 않으며 js에 줄을 추가하지 않습니다. 그러나 어떤 경우에는 jpg 파일을 생성하고 js에 줄을 추가하지 않습니다 (다시 "내부 서버 오류"를 반환). 아주 이상한 행동 - 나는 결과없이 다양한 변화를 시도했다. 내가 뭘 잘못 했니?
#!/usr/bin/perl -w
##
##
use strict;
use CGI;
use CGI::Carp qw (fatalsToBrowser);
use File::Basename;
use Image::Magick;
$CGI::POST_MAX = 1024 * 70000;
my $safe_filename_characters = "a-zA-Z0-9_.-";
my $pic_upload_dir="../data/photos/gallery";
my $lst_upload_dir="../data";
my $lst_file=$lst_upload_dir."/gallery.js";
my $query=new CGI;
my $PictureIndex=$query->param("Snd_AddPhoto_Idx");
my $photoname=$query->param("AddPhoto");
#upload photo
if (!$photoname) {
print "Content-Type: text/plain\n\n";
print "\n\nThere was a problem uploading your photo (try a smaller size).\n";
exit;
}
my ($phname, $phpath, $phextension) = fileparse ($photoname, qr/\.[^.]*/);
$photoname = $phname . $phextension;
$photoname =~ tr/ /_/;
$photoname =~ s/[^$safe_filename_characters]//g;
if ($photoname =~ /^([$safe_filename_characters]+)$/) {
$photoname = $1;
}
else {
die "Filename contains invalid characters";
}
# force correct filename for temporary file
$photoname="tempphoto_zmm_gallery_".$PictureIndex.$phextension;
my $upload_photohandle = $query->upload("AddPhoto");
open (UPLOADPHOTO, ">$pic_upload_dir/$photoname") or die "$!";
binmode UPLOADPHOTO;
while (<$upload_photohandle>) {
print UPLOADPHOTO;
}
close UPLOADPHOTO;
# resize photo
my($photoimage) = Image::Magick->new;
open(PHOTOIMAGE, "$pic_upload_dir/$photoname") or die "Unable to open temporary image file!\n";
$photoimage->Read(file=>\*PHOTOIMAGE);
close(PHOTOIMAGE);
$photoimage->Resize(geometry=>'900x900', blur=>0.8);
$photoimage->Set(Quality=>'75%');
# write ready photo as jpg
my $readyphotoname="pic".$PictureIndex.".jpg";
open(READYIMAGE, ">$pic_upload_dir/$readyphotoname") or die "Unable to write ready image file!\n";
$photoimage->Write(file=>\*READYIMAGE, filename=>$readyphotoname);
close(READYIMAGE);
system("chmod 777 $pic_upload_dir/$readyphotoname");
# resize thumbnail
my($thumbimage) = Image::Magick->new;
open(THUMBIMAGE, "$pic_upload_dir/$photoname") or die "Unable to open temporary image file!\n";
$thumbimage->Read(file=>\*THUMBIMAGE);
close(THUMBIMAGE);
$thumbimage->Resize(geometry=>'140x140^', blur=>0.8);
$thumbimage->Set(gravity=>'Center');
$thumbimage->Crop(geometry=>'140x140+0+0');
$thumbimage->Set(Quality=>'30%');
# write ready thumbnail as jpg
my $readythumbname="tbn".$PictureIndex.".jpg";
open(READYTHUMB, ">$pic_upload_dir/$readythumbname") or die "Unable to write ready image file!\n";
$thumbimage->Write(file=>\*READYTHUMB, filename=>$readythumbname);
close(READYTHUMB);
system("chmod 777 $pic_upload_dir/$readythumbname");
# delete temporary file
my($temporary_file)=$pic_upload_dir."/".$photoname;
unlink($temporary_file) == 0;
# add pic in js gallery list
# prepare new pic record
my $NewGalRecord="GalleryList.push(new Array(\"pic".$PictureIndex.".jpg\",\"tbn".$PictureIndex.".jpg\",\"\",\"\"));\n";
# add to file
open(JS,">>$lst_file") || die "Failed to open $lst_file\n";
printf JS $NewGalRecord;
close JS;
system("chmod 777 $lst_file");
# print confirmation
...
...
...
exit;
단지 '큰'이미지와 썸네일을 업로드하는 스크립트가 잘 때마다 작동합니다 (섹션 'JPG로 준비 썸네일 쓰기' '썸네일의 크기를 조정'과 제외) : 다음은 변경된다. – byddles
서버 로그에보고 된 내용은 무엇입니까? – emcconville
@emcconville'code'admin_zmm_gallery_add.cgi : /home/zmm/public_html/cgi-bin/admin_zmm_gallery_add.cgi 라인의 void 문맥에서 쓸데없는 숫자 eq (==) 사용 108. 'code'admin_zmm_gallery_add.cgi : 75 % "는 /home/zmm/public_html/cgi-bin/admin_zmm_gallery_add.cgi 줄 78, 줄 6399에있는 서브 루틴 항목의 숫자가 아닙니다. 'code'admin_zmm_gallery_add.cgi : 인수"30 % "isn /home/zmm/public_html/cgi-bin/admin_zmm_gallery_add.cgi 줄 97, 줄 6399에있는 서브 루틴 항목의 숫자. 'code' 스크립트 헤더의 끝 부분 : admin_zmm_gallery_add.cgi –
byddles