我正在处理一些我不理解的Perl代码:
my $tmpdir = "XXX";
my $src = "tmp" . time . int rand 10 . ".jpg";
while ( -s "$tmpdir/$src" ) {
$src = "tmp" . time . int rand 10 . ".jpg";
}
my $ua = LWP::UserAgent->new( keep_alive => 0, timeout => 10 );
my $req = HTTP::Request->new(
"GET",
"https://www.com/act/couponimage/1877",
);
my $res = $ua->request( $req, "$tmpdir/$src" );
if ( ! $res || ! -s "$tmpdir/$src" ) {
header( 301, 0, 0, "https://www.com/" );
exit 0;
}
出于某种原因,它会重定向到主页面(标题代码)。
这里显然有问题,因为它永远不会执行重定向的最后一个if
子句。也许它与使用HTTPS有关?
这不是文件系统问题。以下优惠券图像路径正常
Xxx.com/img/coupon-2600.jpg
答案 0 :(得分:0)
请求应该正常,
但正如所指出的,你真的应该检查你正在使用的软件包的版本。
对我来说(perl 5.22 - LWP :: UserAgent 6.26),呼叫$ua->req( $req )
必须是$ua->request( $req->uri )
。并且存储响应的文件必须与$ua->request( $req->uri, :content_file => $fn )
一起提供。
我认为原作者假定通过将文件名提供给$ua->request
来创建内容文件。使用:content_file
,这就是我发生的事情。他把while(-s $ src)放在适当的位置,以确保他得到一个尚未采用的文件名。
因此,我相信你的问题的解决方案是改变
my $res = $ua->request($req, "$tmpdir/$src")
到
$ua->request($req->uri, ':content_file' => "$tmpdir/$src" );
文档提到使用:content_file表示实际响应内容不再存储在对象中,因此您可能需要调整代码。 如果您需要的只是文件,我会调整最终的if以检查现在应该存在的文件(我认为,这应该只在成功响应时发生)。
如果您需要的是稍后要使用的$ res对象,我可能会选择检查响应是否有效,然后将内容打印到您想要的文件中,所以只需执行
my $res = $ua->request( $req->uri );
相应地调整if并将内容打印到文件。 我个人更喜欢后者,因为我可以检查成功的反应,然后打印:这似乎更清楚。