Perl LWP :: UserAgent只读取发布的jpg文件的第一行

时间:2013-12-03 00:10:51

标签: perl lwp

我确信这已被问到,但我找不到一个好的问题。我有两个脚本,一个使用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;

提前感谢您的帮助!

2 个答案:

答案 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数据中。