2015-01-26 4 views
1

이 펄 스크립트는 서버에 이미지를 업로드 한 후 저장합니다 - 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; 
+0

단지 '큰'이미지와 썸네일을 업로드하는 스크립트가 잘 때마다 작동합니다 (섹션 'JPG로 준비 썸네일 쓰기' '썸네일의 크기를 조정'과 제외) : 다음은 변경된다. – byddles

+1

서버 로그에보고 된 내용은 무엇입니까? – emcconville

+0

@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

답변

0

나는이 문제를 해결했다고 생각합니다. 분명히 임시 파일을 두 번 읽을 필요가 없습니다. '큰'이미지를 저장 한 후에도 계속 조작하고 축소판으로 다시 저장할 수 있습니다. 임시 파일을 두 번 읽으면 충돌이 발생합니다. '공유 위반'과 같은 것 - 어둠 속의 한방. 그러나 이제 스크립트는 정상적으로 작동합니다. 별도로 멀리 행 집합을 (품질 =>) 제거했습니다. 나는 그들이 문제와 관련이 있는지 여부를 모른다. 그러나 이것은 앞으로의 시험을받을 것이다.

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