我确信这已被问到,但我找不到一个好的问题。我有两个脚本,一个使用LWP :: UserAgent发布帖子,另一个基本上接收数据,在这种情况下我只是想写一个文件。该文件确实已写入,但无法打开,大小为1262,这使我相信只有部分文件正在被读取。
这就是我正在做的事情(值得注意的是,我是uri / base64编码文件并通过json传递所有内容,这是有效的,但我的新任务是将文件拆分并将所有内容作为形式参数传递):
发布脚本:
open (IMAGE, "./flower.jpg") or die "$!";
$raw_string1 = do{ local $/ = undef; <IMAGE>; };
my $req = HTTP::Request->new(POST => $url);
$req->content_type("application/x-www-form-urlencoded");
$req->content("json_string=$json&file_1=$raw_string1");
my $ua = LWP::UserAgent->new;
$res = $ua->request($req);
print $res->content;
接收者脚本:
$cgi = CGI->new;
my $json_post = $cgi->param('json_string');
my $file_1 = $cgi->param('file_1');
open my $fh, '>', "$path/flower.jpg" or die $!;
binmode $fh;
print $fh $file_1;
close $fh;
提前感谢您的帮助!
答案 0 :(得分:4)
如前所述,您遇到编码问题。解决方案很简单:
my $req = HTTP::Request->new(POST => $url, [
json_string => $json,
file_1 => $raw_string1,
]);
是
的缩写my $req = HTTP::Request->new(POST => $url,
Content_Type => 'application/x-www-form-urlencoded',
Content => [
json_string => $json,
file_1 => $raw_string1,
]
);
但是,使用multipart/form-data
上传文件更为典型。如果你这样做,你甚至可以让HTTP :: Request为你加载文件!
my $req = HTTP::Request->new(POST => $url,
Content_Type => 'multipart/form-data',
Content => [
json_string => $json,
file_1 => [ 'flower.jpg' ],
]
);
CGI.pm将处理没问题。请参阅标题为“处理文件上传字段”的docs部分。
答案 1 :(得分:1)
在将$raw_string1
数据粘贴到HTTP POST正文之前,您不会对其进行编码。这意味着,如果flower.jpg
中的数据包含十六进制0x26字节(&
字符) - 位于1263位,那么说 - 那么POST数据将如下所示:
json_string={ ... JSON data ... }&file_1=...1262 bytes of raw JPEG data...&...more JPEG data...
...这意味着解析表单变量的表单主体将在1262字节后截断file_1
。
我建议继续使用base64或类似的东西对$raw_string1
数据进行编码,即使您将其作为自己的POST变量传递,而不是将其添加到JSON数据中。