2009-04-13 2 views
0

필자는 Perl로 단일 "파일"유형 업로드 필드와 하나의 제출 버튼을 포함하는 웹 양식을 표시하는 간단한 웹 서비스를 작성했습니다. 나는이 간단한 웹 페이지를 인간이 사용할 수있는 의도로 만들었으며 또한 다른 기계의 스크립트도 프로그래밍 방식으로 실행할 수 있다고했습니다. 나는 인간의 모든 부분을 다 수행하고 테스트했는데 이제는 첫 번째 시스템에서이 cgi 스크립트를 성공적으로 실행하는 두 번째 시스템에서 URL을 생성하는 방법을 알지 못한다는 사실을 깨달았습니다 (두 번째 시스템에서 첫 번째 기계)."파일"형식 업로드 입력 필드가 포함 된 CGI 스크립트 양식을 프로그래밍 방식으로 실행하는 방법?

양식 필드가 포함 된 URL을 구성하는 데 경험이 있지만 이전에 "파일"유형의 업로드 입력 필드를 사용한 적이 없으므로 다소 어려움을 겪고 있습니다. 어쩌면 내가 잘못 사용했을 수도 있습니다.

내 간단한 웹 서비스가 "myscript.pl"이라는 cgi-bin 스크립트이고 파일 업로드 필드가 "uploadthis"라고되어 있고 프로그래밍 방식으로 업로드하려는 두 번째 시스템의 파일이 " C : \ myfile.txt "이면 두 번째 컴퓨터의 스크립트에서"http://machine1/cgi-bin/myscript.pl?uploadthis=C : \ myfile.txt "라는 URL을 생성 할 수 없어야하며, 그 파일은 마치 인간이 가지고있는 것처럼 프로그래밍 방식으로 업로드됩니다. 웹 양식의 찾아보기 버튼을 수동으로 클릭하고 해당 파일을 선택하고 제출 버튼을 클릭 했습니까?

첫 번째 컴퓨터에서 cgi 스크립트 양식을 가져 와서 파일을 찾아 제출을 클릭하면 수동으로 올바르게 작동합니다. 파일은 웹 브라우저에서 업로드 한 것 같습니다. 그러나 위 URL을 다른 브라우저의 스크립트에 프로그래밍하기 전에 파일 업로드 URL을 수동으로 테스트하기 위해 브라우저에 위 URL을 입력하면 업로드되는 파일의 길이는 0입니다. 파일을 생성하지만 완전히 비어 있습니다. "http://machine1/cgi-bin/myscript.pl?uploadthis=C : \ myfilethatdoesntexist.txt"와 같이 알려진 잘못된 파일 이름을 사용하면 동일한 결과가 나타납니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

저는이 작업을 Apache 2.2 및 ActivePerl 5.10.0이 적용된 몇 대의 Windows XP PC에서 수행하려고하며 양식 방법은 "게시"입니다.

답변

0

"multipart/form-data"라는 구는 내가 완전히 놓친 것입니다. 내가 그 구절을 Google에서 찾았을 때, 나는 나의 대답을 발견했다.

use HTTP::Request::Common; 
use LWP::UserAgent; 

$ua = LWP::UserAgent->new; 

my $response = $ua->request(
    POST 'http://machine1/cgi-bin/myscript.pl', 
    Content_Type => 'form-data', 
    Content  => [ 
         uploadthis => ["C:\myfile.txt"], 
        ] 
    ); 

if ($response->is_success) { 
    print "Success."; 
} 
else { 
    print "Failure."; 
} 
: 아래의 예와 유사

뭔가 내가 펄 스크립트에서 내 문제를 해결하는 방법입니다

1

우선 매개 변수가 URL 끝에 도달하지 않습니다. 또한 사용자가 드라이브 바이 (drive-by) 업로드를하지 못하도록하기 위해 브라우저에서 완전히 자동화 된 파일 업로드 (JavaScript는 포함하지 않음)를 전송할 수 없습니다.

브라우저에서 업로드하려면 파일을 선택하거나 상자에 파일 이름을 입력하거나 제출 버튼을 수동으로 클릭해야합니다. 이 모든 것이 자동화되면 파일은 업로드되지 않습니다.

당신은 컬 사용할 수있는 프로그래밍 방식으로 파일 업로드를 테스트하려면 :

curl -F "[email protected]:\myfile.txt" http://machine1/cgi-bin/myscript.pl 

당신은 물론 프로그램을 그 게시물의 파일 다중/폼 데이터로도 쓸 수 있습니다.

1

LWP and HTTP::Request::Common 또는 WWW::Mechanize과 같은 모듈을 사용해야합니다. 둘 다 파일 업로드 예제가 있습니다. WWW :: Mechanize는 더 간단하지만 ppm에서 설치해야합니다. LWP는 ActiveState에 포함됩니다.

관련 문제