尝试在Perl中使用ImageMagick编写图像和缩略图时出现内部服务器错误

尝试在Perl中使用ImageMagick编写图像和缩略图时出现内部服务器错误,image,perl,imagemagick,image-uploading,perlmagick,Image,Perl,Imagemagick,Image Uploading,Perlmagick,此Perl脚本将图像上载到服务器,然后保存: -适合900x900像素的画廊图片 -方形画廊缩略图140x140像素 -在js文件中添加一行,其中包含图像和缩略图名称 问题是,脚本有时有效,有时无效。每十次尝试中有一两次效果很好。当它不工作时,它通常返回内部服务器错误,不创建两个文件,也不在js中添加一行。但在某些情况下,它会创建两个jpg文件,并且不会在js中添加一行,再次返回内部服务器错误。非常奇怪的行为-我尝试了各种改变,但没有结果。我做错了什么 #!/usr/bin/perl -w ##

此Perl脚本将图像上载到服务器,然后保存: -适合900x900像素的画廊图片 -方形画廊缩略图140x140像素 -在js文件中添加一行,其中包含图像和缩略图名称

问题是,脚本有时有效,有时无效。每十次尝试中有一两次效果很好。当它不工作时,它通常返回内部服务器错误,不创建两个文件,也不在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;

我想我已经解决了这个问题。显然,不需要读取临时文件两次。保存“大”图像后,我们可以继续操作它,然后再次保存为缩略图。重复读取临时文件显然会导致冲突。有点像‘分享违规’——只是在黑暗中开枪。但现在脚本运行良好。 分别删除了行SetQuality=>。我不知道他们是否与这个问题有关,但这将取决于未来的测试。 以下是变化:

    # 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);

    # 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
    $photoimage->Resize(geometry=>'140x140^', blur=>0.8);
    $photoimage->Set(gravity=>'Center');
    $photoimage->Crop(geometry=>'140x140+0+0');

    # 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";
    $photoimage->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;

当只上传“大”图像而没有缩略图时,没有“调整缩略图大小”和“将缩略图写入jpg”部分,脚本每次都可以正常工作。服务器日志中报告了什么?@emcconville codeadmin_zmm_gallery_add.cgi:在/home/zmm/public_html/cgi bin/admin_zmm_gallery_add.cgi第108行的无效上下文中无用地使用数字eq==。codeadmin_zmm_gallery_add.cgi:Argument 75%在/home/zmm/public_html/cgi bin/admin_zmm_gallery_add.cgi第78行、第6399行的子例程条目中不是数字。codeadmin_zmm_gallery_add.cgi:Argument 30%在/home/zmm/public_html/cgi bin/admin_zmm_gallery_add.cgi第97行、第6399行的子例程条目中不是数字。脚本头的代码结尾:admin_zmm_gallery_add.cgi。。。以下是行:取消链接$temporary\u file==0$photoimage->SetQuality=>75%$thumbimage->SetQuality=>“30%”;我不知道fh0000135.jpg是什么-也不知道我试图上传的图像,也不知道临时图像,也不知道保存的图像有这样的名称。我对设置的质量行进行了评论,脚本开始处理大小为1-2-3MB的图像。对于5-6MB的图像,仍然存在相同的错误。在日志中:脚本标题过早结束:admin_zmm_gallery_add.cgi