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>

但是,以下 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);

如果有人能指出它不起作用的原因,我将不胜感激。谢谢!

4

2 回答 2

7

您提供的 Content-Typetext/plain显然是错误的——您需要发送一条multipart/form-data带有文件作为text/plain附件的 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;到您的代码中即可。

于 2012-11-11T06:42:44.477 回答
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',
   ],
);

的参数->postHTTP::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',
   ],
);
于 2012-11-11T06:46:35.763 回答