如何以编程方式执行包含“文件”类型上传输入字段的CGI脚本表单?

时间:2009-04-13 21:13:38

标签: file url upload cgi

我刚刚编写了一个简单的Web服务(在Perl中),该服务显示包含单个“文件”类型上载字段和单个“提交”按钮的Web表单。我创建了这个简单的网页,其意图是人类可以使用它,并且另一台机器上的脚本也可以以编程方式执行它。我完成并测试了人工部分,现在我才意识到我不知道如何在第一台机器上成功执行此cgi脚本的第二台机器上构建一个URL(并获取从第二台机器上传到的文件到第一台机器)。

我确实有一些构建包含表单字段的URL的经验,但之前从未使用过“文件”类型的上传输入字段,所以我有点挣扎。也许我错了。

如果我的简单Web服务是名为“myscript.pl”的cgi-bin脚本,并且文件上载字段被称为“uploadthis”,并且我想要以编程方式上载的第二台机器上的文件位于“C” :\ myfile.txt“,那么我不应该只能在表格”http://machine1/cgi-bin/myscript.pl?uploadthis=C:\ myfile.txt“的第二台机器上的脚本中构建一个URL,并且该文件以编程方式上传,就好像一个人手动点击了Web表单上的浏览按钮并选择了该文件并单击了Submit按钮?

当我在第一台机器上显示cgi脚本表单并浏览到该文件并单击“提交”时,它可以正常工作。该文件似乎被网络浏览器上传得很好。但是当我将上述URL输入到我的浏览器中以在将该URL编程到另一台机器上的脚本之前手动测试文件上载URL时,上传的文件是零长度文件。它会创建一个文件,但它完全是空的。如果我使用已知的错误文件名,例如“http://machine1/cgi-bin/myscript.pl?uploadthis=C:\ myfilethatdoesntexist.txt”,结果相同。我做错了什么?

我正在尝试使用Apache 2.2和ActivePerl 5.10.0在几台Windows XP PC上完成此任务,并且表单方法是“post”。

3 个答案:

答案 0 :(得分:1)

首先,帖子参数不会在URL的末尾结束。此外,无法从浏览器(甚至不使用JavaScript)完全自动发送文件上传,只是为了防止用户进行偷渡式上传。

如果要从浏览器上传,则必须始终选择文件或在框中键入文件名,或手动单击“提交”按钮。如果所有这些都是自动的,则不会上传文件。

要以编程方式测试文件上传,您可以使用curl:

curl -F "uploadthis=@C:\myfile.txt" http://machine1/cgi-bin/myscript.pl

您当然可以编写一个将文件发布为multipart / form-data的程序。

答案 1 :(得分:1)

您应该使用LWP and HTTP::Request::CommonWWW::Mechanize等模块。两者都有文件上传的例子。 WWW :: Mechanize更简单,但您应该只从ppm安装它。 LWP包含在ActiveState中。

答案 2 :(得分:0)

短语“multipart / form-data”是我完全错过的。当我谷歌这句话时,我找到了答案。

与下面的示例类似的是我如何从perl脚本解决我的问题:

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.";
}