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와 같다.
 

관련자료

등록된 댓글이 없습니다.
Today's proverb
우리가 행복한지의 여부는 우리들 각자가 진짜로 원하는 삶을 향해서 얼마나 당당하게 다가가고 있느냐에 달렸다. 그 채점 또한 저마다의 몫이다. (김한길)