2010-12-29 7 views
2

대용량 파일 (> 500MB)을 업로드하기위한 스크립트를 작성하려고합니다. 업로드가 처리되기 전에 나는 예를 들어, 어떤 인증을하고 싶으면 :HTTP POST 요청 서버 측 취소

$id = $_GET['key']; 
$size = $_GET['size']; 
$time = $_GET['time']; 
$signature = $_GET['signature']; 

$secret = 'asdfgh123456'; 

if(sha1($id.$size.$time.$secret) != $signature){ 
echo 'invalid signature'; 
exit; 
} 
process upload... 

불행하게도 PHP는이 코드를 실행 파일을 임시 디렉토리에 업로드 한 후, 귀중한 서버 리소스를 차지. 업로드가 이루어지기 전에이 작업을 수행 할 수있는 방법이 있습니까? 나는 perl/cgi와 비슷한 것을 시도했지만 같은 일이 일어난다.

답변

6

와우, 어떻게 대답 할 수 없는지에 대한 5 가지 답변. mod_perl to the rescue, 전체 요청 본문이 업로드되기 전에 여기에서 요청을 거부 할 수 있습니다.

+0

와우, 고마워. 당신은 나에게 희망의 광선을 주었다.] 나는 펄 프로그래머가 아니기 때문에 (따라서 PHP 코드), 독서를하고 내가 효과를 낼 수 있는지 알아볼 것이다. – Jack000

+1

하루 종일 걸렸지 만 마침내 작동하게되었습니다. – Jack000

+0

이제 내 인증 기능이 PerlPostReadRequestHandler 핸들러를 사용합니다. 아마 핸들러 스택 아래로 내려 놓을 수는 있지만, 그대로 잘 작동합니다. – Jack000

0

필자가 아는 한, PHP에서는 그렇게 할 수 없습니다. PHP 스크립트는 요청에 대한 응답으로 시작되지만 업로드되는 파일은 요청의 일부이므로 요청이 파일이 업로드 될 때까지 "전송되지"않습니다.

3

PHP 스크립트가 호출되기 전에 Apache가 업로드를 처리하므로 사용자가 PHP 스크립트를 사용할 수 없습니다.

프로세스를 두 페이지 (인증, 파일 업로드 페이지)로 분할하거나, 한 페이지에서 모두 처리해야하는 경우 인증 매개 변수를 확인한 후 AJAX-esque 솔루션을 사용하여 파일을 업로드 할 수 있습니다.

+1

JavaScript를 제외한 파일 크기에는 액세스 할 수 없습니다. http://www.google.com/search?이론적으로는 sourceid = chrome & ie = UTF-8 & q = 파일 + 업로드 + 크기 + javascript # q = 파일 + 업로드 + 크기 + javascript + stackoverflow & hl = ko & prmd = ivns & tbs = dsc : 1 & tbo = u & sa = X & ei = mKsbTcG-K4S8lQeH8PGrDA & ved = 0CCwQmAcwAg & fp = 6db204469b4cb2b1 HTML5-ish File API를 사용하여 제한된 지원이 가능합니다. http://stackoverflow.com/questions/1606842/how-can-i-get-a-files-upload-size-using-simple-javascript/2474914#2474914 – Yahel

+0

@yc : 권리. 파일 크기는 클라이언트 측에서 확인할 수 없습니다. 그것은 상쇄 관계에 있습니다. – webbiedave

+0

내 주요 관심사는 잘못된 무단 업로드로 인해 서버를 도킹 한 악의적 인 사용자입니다. 이것을 막을 수있는 방법이 있습니까? – Jack000

0

업로드 할 PHP 스크립트에서는 불가능합니다.

업로드가 이루어지기 전에 가장 간단한 방법은 실제로 인증을 한 번 제공하는 것입니다.

이 옵션이 아니면 RewriteMap을 사용하여 외부 프로그램에 매핑합니다 (해당 프로그램을 PHP 스크립트로 만들 수 있어야합니다).

RewriteMap을 사용하면 명령 줄 프로그램의 출력을 기반으로 URL을 다시 쓸 수 있습니다. 이 지시어를 사용하여 (별도의) PHP 스크립트를 호출하면 사용자의 세션을 사용할 수 없게됩니다! - 요청이 처리되기 전에 GET 매개 변수에 액세스 할 수 있습니다.

처리가 실패한 경우 (= 자격 증명이 유효하지 않은 경우) 요청을 PHP가 시작되지 못하도록하는 정적 리소스로 리디렉션 할 수 있습니다. (필자는 업로드 어쨌든 일부 자원을 독차지 할 것으로 가정 없지만,이 PHP로 리디렉션 경우보다 아마 더 적은.)이 작동합니다 여부를

없음 보장! RewriteMap에 대한 경험이 없습니다.

0

각 HTTP 요청에 파일 업로드 데이터를 포함하여 모두 양식/POST 데이터가 포함되어 있기 때문입니다.

이와 같이 필자는 어떤 스크립트 언어를 사용하든 관계없이 이러한 방식으로 파일 업로드 요청을 처리 할 수 ​​있다고 생각하지 않습니다.

+0

서버는 전체 요청이 제출되기 전에 헤더를 확실히 처리 할 수 ​​있습니다. 프레임 워크가 해당 데이터에 액세스 할 수 있는지 여부는 완전히 다른 문제입니다. – EricLaw

+0

@EricLaw -MSFT- 이론적으로 (결국 진행중인 I/O 스트림 일 수 있음) 이론적으로 볼 수는 있지만이 기능이 노출 된 적이 전혀 없습니다. –

0

나는 이것을 할 수 있다고 생각하지 않습니다. 당신이 할 수있는 최선의 방법은 아마도 AJAX 함수를 onSubmit을 실행하여 유효성 검사를 먼저 수행 한 다음 유효성이 반환되면 POST를 실행하여 파일을 업로드하는 것입니다. 인증이 유효한 경우 AJAX 스크립트에 $_SESSION을 설정 한 다음 업로드 스크립트에서 해당 세션 var를 확인하여 업로드를 허용 할 수 있습니다.