PHP & Others

대용량 업로드 C cgi

컨텐츠 정보

본문

http://hi.comn.com/upload.tgz 
------------------------------------------------------------

php나 기타 웹 프로그램은 대용량 파일을 업로드 할때가 가장 난감하다.

php의 경우 php.ini를 바꿔줘야 되고 그 또한 맘대로 건드리기 쉽지 않다.

그래서 업로드 컴포넌트라고 해야되나 ㅡ.ㅡ?

하여튼 대용량이 업로드 가능하게 C cgi로 만들어 봤다.

테스트 결과 800메가 이상의 영화 파일도 문제 없이 올라갔다.

cgi의 문제점은 예전부터 잘 알려져있어서 본좌가 덧붙여 말하지 않아도 잘 알것이다.

어쨌든 upload.cgi는 대용량 업로드가 중심이니깐 프로세스 문제나 보안 문제는 뒤로 접어 두도록 한다.

일단 압축을 풀면

upload.cgi <== 업로드 처리 파일
upload.dat <== 환경설정 파일

파일 두개가 나온다.

upload.cgi는 실행 파일이므로 서버상에 올렸을 때 실행 퍼미션을 줘야 된다.

chmod +x upload.cgi

upload.dat <== 이건 그냥 텍스트 파일이다. 어떠한 편집기를 사용해도 다 된다.
첫번째 줄에 업로드 디렉토리를 적어주고... upload.cgi를 기준으로 상대경로를 적어주면 된다. 예) data/ ../data/up/ 마지막에 /를 꼭 적어주자!
두번째 줄에 업로드가 완료된 후 이동할 파일을 적어주면 된다.

두번째 줄에 적는 파일은 upload.cgi에서 보내준 정보를 파일 업로드 후 다시 post로 submit함으로 그냥 마지막 파일에서 일반 프로그램 하듯이 그대로 하면 된다.

--- upload.dat ---
up_data/
end.php


단계는 이렇다.

upload.html -> upload.cgi -> end.php

그러니깐 보통 프로그램 하듯이 end.php에서 디비 작업을 해주면 된다. upload.cgi는 없다고 보면 된다. upload.cgi는 파일 업로드 후 <input type="file" name="up"> 이라고 했을 때 end.php에서 echo $up;을 하면 파일 이름이 출력될 것이다. up[] 이처럼 배열도 그대로 절달 됨으로 기존에 프로그램 하듯이 그대로 하면 된다.

예제)
--- upload.html ---
<form action="upload.cgi" method="post" enctype="multipart/form-data">
이름 <input type="text" name="name">
첨부파일1 <input type="file" name="up[]">
첨부파일2<input type="file" name="up[]">
첨부파일3<input type="file" name="up[]">
<input type="submit">
</form>

--- end.php ---
이름:<?=$name?><br>
첨부파일1:<?=$up[0]?><br>
첨부파일2:<?=$up[1]?><br>
첨부파일3:<?=$up[2]?><br>

---------------------------------------------------


ver 3

지금 이래저래 테스트 중에 있습니다.

아래 버젼에서 일부러 뺀 부분을 넣어 달라는 분이 많아서

환경설정 파일을 빼고 업로드 디렉토리와 처리 파일을 동적으로 할 수 있도록 프로그램을 변경해 봤습니다.

upload.cgi를 호출하는 html 페이지에서

히든으로 upload_dir, return_url에 값을 넣어주면 됩니다.

아래 예제 처럼...


<form method="post" action="upload.cgi" enctype="multipart/form-data">

<input type="hidden" name="upload_dir" value="up/">
<input type="hidden" name="return_url" value="end.php">
name <input type="text" name="name">
.....
....
..

</form>

그러니깐 업로드 폼 작성하실 때 이렇게 히든 폼이 반드시 두개가 들어가야 됩니다.

upload_dir 위치는 상대 경로를 지정해 주셔야 됩니다.
버젼업 하면서 /를 붙였는지 조사 하기 때문에 끝에 /를 붙이던 안 붙이던 상관 없습니다.

<input type="hidden" name="upload_dir" value="up/">
<input type="hidden" name="return_url" value="end.php">


역시 개발자가 하는 테스트는 구멍이 너무나 많터군요.
테스트 하는 방식이 정해져 있어서 버그를 발견하기 쉽지 않네요~

아래 버젼에서도 잘 모르시겠지만 엄청난 버그가 있습니다.

업로드콤퍼넌트인데.... 업로드를 안하면 에러가 ㅡ.ㅡ
그러니깐 업로드 폼을 여러개 만들어 놓고 처음 폼에 업로드 하지 않고 중간이나 끝에 업로드 하면 제대로 업로드가 되지 않습니다.

테스트 할 때 꼭꼭 값을 넣어서 테스트하니 이런 문제가 있는지는 꿈에도 생각 못 했습니다.

지금 버젼은 테스트를 해 봤는데... 잘 되더군요^^

이것도 나홀로 테스트 밖에 못 해서 어디서 버그 날지는 저도 잘 모르겠습니다.

일단 사용해 보시고 이상이 있으시면 코멘트 남겨주세요~

ver3에서는 파일 중복 처리에 대해서 작업하려고 합니다.
중복 파일 업로드시 중복 되는 놈을 끝에 타임스템프를 붙여서 중복을 방지할까 하는데...... 걍 생각만 하고 있습니다.

그럼...


-----------------------------------------------
이제 마지막 버젼일꺼 같다.

중복파일 처리를 완벽하지는 않지만... 어느정도까지 처리해 봤다.

완변하게 처리할려고 하니 머리가 아파서 단순하게

파일 끝에 시분초를 붙여봤다.

매일마다 똑 같은 시간에 똑 같은 파일을 올리지 않는 이상 겹치지 않을것 같다.

사용법은 ver2와 같다.
 

관련자료

댓글 0
등록된 댓글이 없습니다.
Today's proverb
행복해지고 싶다면, 잠시 동안만이라도 가슴에 손을 얹고 생각해 보라. 그러면 진정한 즐거움은, 발치에 돋아나는 잡초나 아침 햇살에 빛나는 꽃의 이술과 같이 우리 주변에 무수히 널려 있다는 것을 알 수 있을 것이다. 《하루 5분 생각이 인생을 결정한다 》 (이범준)