在Perl中使用mechanize响应下载不正确的文件
我创建了一个脚本,可以通过基本身份验证访问URL。一旦我通过了凭据,它将下载我本地文件夹中的文件。问题是我的文件名不正确。以下是我的示例代码:在Perl中使用mechanize响应下载不正确的文件,perl,download,mechanize,Perl,Download,Mechanize,我创建了一个脚本,可以通过基本身份验证访问URL。一旦我通过了凭据,它将下载我本地文件夹中的文件。问题是我的文件名不正确。以下是我的示例代码: #!/usr/bin/env perl use strict; use warnings; u
#!/usr/bin/env perl
use strict;
use warnings;
use WWW::Mechanize;
use HTTP::Cookies;
my $url = "http://sampleurl.com";
my $dir = 'C:\\pl';
my $mech = WWW::Mechanize->new();
$mech->cookie_jar(HTTP::Cookies->new());
$mech ->credentials("sampleurl.com:80", "sampleurl.com", "username", "password");
$mech->get($url);
my $res = $mech->res();
if($res->is_success){
my $filename = $res->filename();
print $filename;
$mech->save_content( $dir.'\\'.$filename, binmode => ':raw', decoded_by_headers => 1 );
print $mech->status;
}else{
print "Error";
}
exit 0;
它没有下载sample_url.DOC,而是只下载了没有文件扩展名的sample。你能帮我解决问题吗?我想下载整个文件。不能保证
$res->filename()
将生成一个文件扩展名或任何与此相关的内容。例如,您当前阅读的页面没有文件扩展名
您必须根据媒体类型猜测文件扩展名
use MIME::Types qw(by_mediatype);
您是否确定该文件没有扩展名,并且Windows不只是在其GUI文件查看器中对您隐藏扩展名。(这是默认行为。)您是否尝试过使用
dir
命令查看命令行上的文件?尝试通过执行以下操作打印$res
:使用数据::转储程序;打印转储程序($res)
这将允许您查看发送的请求和响应,除了$res
中的整个数据结构之外,它还应该向您显示在doc for HTTP::Response中接收到的内容。方法文件名给出返回的字符串是按以下顺序派生的:1)来自标题内容配置2)来自标题内容位置3)来自用于请求的URI。按照@nrathaus的建议执行,或者使用ie FireBug或Wireshark检查HTTP头,以了解Web服务器为Mechanize对象返回的内容
my $filename = $r->filename();
if(!$filename) { $filename = 'untitled'; }
if($filename !~ /\.[a-zA-Z0-9]{1,4}$/) {
my $type = $res->header('Content-Type');
my $ext = 'txt';
if($type) {
my @types = by_mediatype($type);
if($#types > -1) {
$ext = $types[0][0];
}
}
$filename .= '.' . $ext;
}
print $filename;