웹솔루션개발 22년 노하우! 해피CGI의 모든것

[해피CGI][cgimall][perl] 파일 업로드 루틴 본문

웹프로그램밍 자료실/알짜자료 골드팁

[해피CGI][cgimall][perl] 파일 업로드 루틴

해피CGI윤실장 2017. 1. 17. 09:05

해피CGI 입니다.

파일 업로드를 위해서 라이브러리를 사용하거나 혹은 남이 만들어 놓은 소스를 가져다 쓰는 경우가 많습니다.

저 역시 그렇죠.

중간 코딩시 오류가 나면 참 난감할때가 많습니다. (왜 안되는지 이해가 안가서)

파일 업로드의 이해를 위해서는 gif 나 혹은 jpg 혹은 다른 바이너리 파일들이 어떤 형식으로

만들어져있는지를 이해를 하면 업로딩이 아주 쉽습니다.

업로드에 대해 막연한 두려움을 갖고 있다가 약 일주일만에 (아주 예전일입니다. ^^)

만든 코드입니다.

아래코드는 제가 즐겨 쓰는 코드입니다. 참고되시길...

 


[프로그램코드]

#!/usr/bin/perl

 


$basedir  = "파일저장 절대경로를 지정";
#예를 들면 $basedir  = "/home/happycgi/public_html/file"; 이런식으로..

my $buffer;
 
 $time = time;
$work = $ENV{"QUERY_STRING"};
@pairs_end = split(/&/, $work);
foreach $pair (@pairs_end) {
   ($kname, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
   $END{$kname} = $value;
 }

 if ($ENV{'REQUEST_METHOD'} eq "POST") {
  binmode STDIN;
  read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
 }
 else { $buffer = $ENV{'QUERY_STRING'}; }
 my ($qx_name, $value);
 if ($buffer !~ /\n/) {
  for (split /&/, $buffer) {
   ($qx_name, $value) = split /=/;
   $qx_name =~ y/+/ /; 
   $qx_name =~ s/%(..)/chr hex $1/ge;
   $value =~ y/+/ /; 
   $value =~ s/%(..)/chr hex $1/ge;
   $$qx_name = $value;
  }
 }
 else { # 파일 업로드
  my ($qx_name, $value);
  my ($border) = ($buffer =~ /^(.+?)\r?\n/);
  $buffer =~ s/${border}--$//;
  my $bad_char = '`~!@#%^&*()|,<>?;:\'"[]{}';

  for (split /$border/, $buffer) {

   next if $_ eq '';
   s/^\r?\n//;

   if (/name="FILE(\d+)"; filename="(.+?)"/i) {
 my ($FILE_VAR) = $1;
    next if $2 eq '';
 
 my ($FILE_NAME) = $2 =~ m{([^\\^/]+)$};
 $FILE_NAME =~ s/[$bad_char]//g;
 #파일이름 배열저장
    $FILES{'file'}->{name} = $FILE_NAME;
    s/^.+?\r?\n\r?\n//s;
    s/\r?\n$//s;
  if($_ eq '') {
   $FILES{'file'}->{name} = '';
   next;
  }
  else {
  open (A,">$basedir/$time-$FILE_NAME");
  binmode(A);
  print A $_;
  close (A);
  }
  #파일내용 배열저장
  #$FILES{'file'}->{data} = $_;
     my ($File_Name_In) = "FILE" . "$FILE_VAR";
  $Field{$File_Name_In} = $FILE_NAME;

  }
 
  else {
   s/^.+?name\=\"(\S+?)\"\r?\n\r?\n(.+?)\r?\n$//s;
   ($qx_name = $1) =~ tr/\r//d;
   ($value = $2) =~ tr/\r//d;
   $$qx_name = $value;
  }
 } #for
}#else

 


 

 

위 루틴은 폼값 즉 post에서 받아온 name 값을 그대로 변수값으로 전달해줍니다.

<input type=text name=haha value="머지">

라는 값은 위 루틴을 통과하면서 $haha 라는 값에 "머지" 가 바로 들어가게 되어있죠.

첨부되는 파일 갯수는 제한없이 올릴수 있습니다

첨부되는 파일네임값은 만드시 FILE1,FILE2 와 같은 형식으로 해야 합니다.

아래 처럼 말이죠.

<input type=file name=FILE1>

첨부되는 파일네임값은  $Field{'FILE1'} 로 받게 됩니다.

위의 일반 text나 select , radio 값을 받는 것과 형식이 조금 다르죠? ^^


파일에 대한 좀더 깊은 이해를 바라며~ ^^

 

홈페이지바로가기 

Comments