在Perl中使用mechanize响应下载不正确的文件

在Perl中使用mechanize响应下载不正确的文件,perl,download,mechanize,Perl,Download,Mechanize,我创建了一个脚本,可以通过基本身份验证访问URL。一旦我通过了凭据,它将下载我本地文件夹中的文件。问题是我的文件名不正确。以下是我的示例代码: #!/usr/bin/env perl use strict; use warnings; u

我创建了一个脚本,可以通过基本身份验证访问URL。一旦我通过了凭据,它将下载我本地文件夹中的文件。问题是我的文件名不正确。以下是我的示例代码:

#!/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;