0

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

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

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

当我在第一台机器上调出 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”。

4

3 回答 3

1

首先,post 参数不会出现在 URL 的末尾。此外,不可能从浏览器发送完全自动化的文件上传(即使是 JavaScript 也不行),只是为了防止用户偷偷上传。

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

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

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

当然,您也可以编写一个将文件作为多部分/表单数据发布的程序。

于 2009-04-13T22:41:05.607 回答
1

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

于 2009-04-26T23:27:50.940 回答
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.";
}
于 2009-04-27T19:03:42.690 回答