【问题标题】:Perl LWP::UserAgent only reading first line of posted jpg filePerl LWP::UserAgent 只读取发布的 jpg 文件的第一行
【发布时间】:2013-12-03 00:10:50
【问题描述】:

我确定有人问过这个问题,但我找不到适合我的答案的问题。我有两个脚本,一个使用 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;

提前感谢您的帮助!

【问题讨论】:

  • 欢迎随机投票!我可以提供更多的代码,更少的代码,更好的细节来说明我想要做什么,但是随机投票很糟糕。
  • 您是如何收到$file_1 变量的?
  • 感谢您的回复。我编辑了上面的代码以显示在接收器脚本中。

标签: perl lwp


【解决方案1】:

如前所述,您遇到了编码问题。解决方法很简单:

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 中标题为“处理文件上传字段”的部分。

【讨论】:

  • 感谢您的建议!我得到了它的工作使用你的建议。非常感谢!
  • 我实际上最终选择了这个:my $url = "";我的 $data = [json_string => $json, 'flower.jpg' => $raw_string1, 'fw4.pdf' => $raw_string2];我的 $ua = LWP::UserAgent->new; $res = $ua->request(POST($url, $data));打印$res->内容;
  • 多么奇怪的格式。文件名作为标识符?!使用表单数据,您的字段可以同时具有文件名和文件内容。同样,如果你正在设计一个协议,我推荐 form-data。
  • 好吧,我不允许对任何内容进行 base64 编码并将其粘贴到我的 json 数组中,这就是我最初所做的。所以,我的任务是通过一个 json 参数接受一堆 json 数组,然后分别作为表单参数,一堆文件名参数。每个 json 数组的最后一个键值对是一个文件名,因此我可以在处理每个数组时识别并粘贴文件。在测试中,我正在寻找其中的几百个。我当然愿意接受建议。此外,我在尝试发布到 https 时确实遇到了使用您建议的语法的问题。
  • 再次感谢您的帮助,您的解释使我能够更好地掌握事情并让事情发挥作用。 edit 可能还需要注意,我不会写 post 端,只写接收器脚本。
【解决方案2】:

在将 $raw_string1 数据粘贴到 HTTP POST 正文之前,您没有对其进行编码。这意味着如果flower.jpg 中的数据包含一个十六进制的 0x26 字节(&amp; 字符)——比如说,在位置 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 数据中。

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 2015-04-09
    • 1970-01-01
    • 2010-12-26
    • 2021-12-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多