2012-11-11 4 views
1

나는 이것을 두시간 동안 붙들어 왔고 연구를 통해 해결책을 찾지 못했습니다.펄에서 파일을 업로드하기위한 헤더는 무엇입니까?

다음 HTML 코드는 내가 필요로 무엇을 작동합니다

<form action="uploader.php" method="POST" enctype="multipart/form-data"> 
<label for="file">Filename:</label> 
<input type="file" name="Filedata" id="file" /> 
<br /> 
<input type="submit" name="submit" value="Submit" /> 
</form> 

그러나 다음 펄 코드가 작동하지 않습니다. 나는 이것이 필요한 헤더를 보내지 않기 때문이라고 생각합니다.

my @headers = ('Content-Disposition' => 'form-data; name="Filedata"; filename="test.txt"', 
       'Content-Type'  => 'text/plain', 
       'Content'    => 'File content goes here.'); 

my $browser = LWP::UserAgent->new; 
my $response = $browser->post('uploader.php', undef, @headers); 

아무도 내가 작동하지 않는 이유를 지적 할 수 있으면 감사 할 것입니다. 감사합니다.

+0

'$ browser'는 무엇입니까? – Mat

+0

죄송합니다. 다음을 추가하십시오. – user1807879

+0

http://search.cpan.org/~gaas/HTTP-Message-6.06/lib/HTTP/Request/Common.pm의 양식 데이터로 POST의 예를 적용 해 보았습니다. ? – jpalecek

답변

4
my $response = $ua->post('http://.../uploader.php', 
    Content_Type => 'form-data', 
    Content => [ 
     Filedata => [ undef, 'test.txt', 
     Content_Type => 'text/plain', 
     Content  => "Hello, World!\n", 
     ], 
     submit => 'Submit', 
    ], 
); 

인수는 HTTP::Request::CommonPOST 하위에 동일한 인수이다.

실제로 디스크에서 파일을 읽을 수도 있습니다.

my $response = $ua->post('http://.../uploader.php', 
    Content_Type => 'form-data', 
    Content => [ 
     Filedata => [ 'test.txt', 'test.txt', 
     Content_Type => 'text/plain', 
     ], 
     submit => 'Submit', 
    ], 
); 
+0

@hobbs가 내 대답을 작곡하는 동안 나와 거의 비슷한 것을 게시 한 것처럼 보입니다. 차이점 : 1) 양식의 두 번째 필드 ('submit', 스크립트가 아마도 무시할지라도)를 잊지 않았습니다. 2) 두 개의 스 니펫 중 하나에서 파일의 내용 유형을 지정하는 것을 잊지 않았습니다. LWP가 기본값을 추측하려하지만) 3) 구문이 더 짧을뿐 아니라'use HTTP :: Request :: Common qw (POST); '를 사용할 필요가 없습니다. – ikegami

+0

더 나은! 그런 다음 추가 모듈이 필요 없습니다. 많은 사람 감사합니다! – user1807879

+0

모듈이 아직 사용되고 있습니다. 당신은 당신 자신을 다룰 필요가 없습니다. – ikegami

7

분명히 틀린 내용 유형 text/plain을 제공하고 있습니다. 파일이 text/plainmultipart/form-data MIME 메시지를 보내야합니다. 일 수 있습니다. MIME 모듈을 사용하여이 작업을 수행하지만, jpalecek이 지적한대로 HTTP::Request::Common은 이미 수행 방법을 알고 있습니다. 이 같은 요청은 작동합니다 :

my $response = $browser->request(
    POST "http://somewhere/uploader.php", 
     Content_Type => 'form-data', 
     Content => [ 
      Filedata => [ 
       undef, 
       "test.txt", 
       Content_Type => "text/plain", 
       Content => "file content goes here" 
      ] 
     ] 
); 

또는 TEST.TXT 실제로 디스크에있는 경우 :

my $response = $browser->request(
    POST "http://somewhere/uploader.php", 
     Content_Type => 'form-data', 
     Content => [ 
      Filedata => [ "/path/to/test.txt" ] 
     ] 
); 

충분합니다. 두 경우 모두 use HTTP::Request::Common;을 코드에 추가하십시오. ->post위한

+1

고마워요! 그것은 완벽하게 작동했습니다. 'Content-Type' 헤더를'form-data'로 설정하려고했습니다. 실패했습니다. 당신 덕분에 나는 왜 이해하는지 알 수 있습니다. 다시 한번 감사드립니다. – user1807879

관련 문제