2012-11-11 48 views
1

我一直被困在这里好几个小时,我一直没能通过研究找到解决方案。用Perl上传文件的头文件?

下面的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> 

但是,下面的Perl代码不起作用。我认为这是因为我没有发送所需的头文件。

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', 
    ], 
); 

->post的ARGS是HTTP::Request::CommonPOST子相同ARGS。

它也能够从磁盘读取文件给你,如果这是你真正想要做的。

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,显然是错误的 - 您需要发送multipart/form-data MIME消息,并将该文件作为text/plain机箱。你可能用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;添加到您的代码。

+1

谢谢!这工作完美。 我曾尝试将'Content-Type'头部设置为'form-data',但它失败了。 感谢你我明白为什么,但我明白。再次感谢。 – user1807879