Perl中的文件上传哪些标题?

use*_*879 1 perl upload header file

我已经被困在这几个小时了,我无法通过研究找到解决方案.

以下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>
Run Code Online (Sandbox Code Playgroud)

但是,以下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);
Run Code Online (Sandbox Code Playgroud)

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

hob*_*bbs 7

您提供的内容类型text/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"
            ]
        ]
);
Run Code Online (Sandbox Code Playgroud)

或者如果test.txt实际存在于磁盘上:

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

就足够了.在任何一种情况下,只需确保添加use HTTP::Request::Common;到您的代码.