시작페이지로 즐겨찾기추가
로그인
회원가입 l 출석체크 l 마이페이지 l CGIMALL
자료실 사이트등록 랭킹100 프로그램리뷰 관리자추천자료 초보가이드
커뮤니티
전체 펼쳐보기
퀵메뉴링크 jquery , CSS , PHP , Javascript , 무료폰트 , ASP
상세검색
> 커뮤니티 > 골드팁 상세보기
커뮤니티 구인구직
사이트등록
클라우드태그
Javascript
php
CSS
html
asp
API
jquery
mysql
image
Mobile
slide
게시판
메뉴
현재접속자 31 새로고침
게시판타이틀 골드팁 / 상세보기
트위터로 보내기
추천수 332 | 조회수 4,300 | 등록일 2003-11-16 17:21:59

닉네임

HappyCGI

제목

[perl] 파일 업로드 루틴
내용

해피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 값을 받는 것과 형식이 조금 다르죠? ^^


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

추천스크랩소스보기 목록
jutammu 2004-02-23 16:59:55
답글

권한설정은 어떻게 해야하나요?
그리고 form name은 아무렇게나 해도 상관이 없는지요?

이전게시글 [초보팁] cgi 파일을 수정할때 주의할점들 2003-10-14 10:37:54
다음게시글 현재 사이트에 먹힌 쿠키보기 2003-12-19 16:21:15