Perl — HTTP::Request::Common — POST file AND array



我正在尝试将文件发布到Web应用程序端点中。问题是在同一请求中,我需要包含数组作为其中一个参数的值。

my $ua = LWP::UserAgent->new();
my $response = $ua->post(
$baseurl_local . 'create',
Content_Type => 'form-data',
Content      => [
file =>  [$file],
targetLang => 'french',
]);

工作得很好。

但是当我尝试

my $ua = LWP::UserAgent->new();
my $response = $ua->post(
$baseurl_local . 'create',
Content_Type => 'form-data',
Content      => [
file =>  [$file],
targetLang => ['french','spanish],
]);

我得到

无法打开法语文件:在 C:/Strawberry/perl/site/lib/HTTP/Request/Common.pm 第 154 行没有这样的文件或目录。 HTTP::Request::Common::form_data(ARRAY(0x6800698(, undef, HTTP::Request=HASH(0x6803a70(( 在 C:/Strawberry/perl/site/lib/HTTP/Request/Common.pm 第 67 行

调用

Perl 似乎认为带有语言的数组引用是一个文件。

我做错了什么?


根据 Matt 的回答扩展分辨率:正如我最初忘记提及的那样,语言列表来自用户输入,所以我最终做了这样的事情:

my @languages = (targetLang => 'french', targetLang => 'spanish');
my $ua = LWP::UserAgent->new();
my $response = $ua->post(
$baseurl_local . 'create',
Content_Type => 'form-data',
Content      => [
file =>  [$file],
@languages,
]);

来自 HTTP::Request::Common docs:

可以通过重复字段来指定多值表单字段 名称或通过传递值作为数组引用。

POST 方法还multipart/form-data支持用于 RFC 1867 中指定的基于表单的文件上载。你触发这个 通过将内容类型'form-data'指定为以下之一来设置内容格式 请求标头。如果$form_ref中的一个值是数组 引用,然后将其视为文件部分规范...

因此,虽然您通常可以使用数组引用指定多值字段,但数组引用对于multipart/form-data内容具有特殊意义,您可能必须通过重复字段名称来绕过它:

my $response = $ua->post(
$baseurl_local . 'create',
Content_Type => 'form-data',
Content      => [
file       => [$file],
targetLang => 'french',
targetLang => 'spanish',
],
);

最新更新