2

Perl を使用しWWW::Mechanizeて、400KB (約 20 秒) のチャンクで提供される MP3 ファイルをダウンロードしています。

ファイル ハンドルでデータを保存するとbinmode、各チャンクが到着するたびに追加され、最初のチャンクだけが正しく再生されます。残りはそうではありません。

使用していないときはbinmode、ファイル全体を再生することはできません。

これは私のプログラムです

use WWW::Mechanize;

$agent = WWW::Mechanize->new( cookie_jar => {} );

@links = ("http://thehost.com/chunk1","http://thehost.com/chunk2","http://thehost.com/chunk3");

foreach (@links){
    $agent->get($_);

    my $filename = 'test.mp3';
    open(my $fh, '>>', $filename) or die "Could not open file '$filename' $!";
    binmode $fh;
    print $fh $agent->content;
    close $fh;
}

私は何を間違っていますか?

アップデート

これらは、返される HTTP ヘッダーです。

Cache-Control: public
Connection: close
Date: Tue, 28 Oct 2014 18:38:37 GMT
Pragma:
Server: Apache
Content-Length: 409600
Content-Type: application/octet-stream
Expires: Sat, 24 Oct 2015 12:08:00 GMT
Access-Control-Allow-Origin: *
Client-Date: Tue, 28 Oct 2014 18:38:28 GMT
Client-Peer: **.**.***.***:80
Client-Response-Num: 1
4

3 に答える 3

1

あなたが得ている動作を説明することはできませんが、WWW::MechanizeHTML テキスト ページでの作業を目的としており、バイナリ データには適していません。モジュールを直接使用するLWP::UserAgentことはまったく難しくありません。

代わりにこのようなものを使用することをお勧めします。

use strict;
use warnings;
use 5.010;
use autodie;

use LWP;

my @links = qw(
  http://thehost.com/chunk1
  http://thehost.com/chunk2
  http://thehost.com/chunk3
);

my $agent = LWP::UserAgent->new;

my $filename = 'test.mp3';
open my $fh, '>:raw', $filename;

for my $link (@links) {
    my $resp = $agent->get($link);
    die $resp->status_line unless $resp->is_success;
    print $fh $resp->decoded_content;
}

close $fh;

それでも問題が解決しない場合は、次のような行を追加してください

print $resp->headers_as_string, "\n\n";

電話の直後に、get得られた結果を報告してください。

contentの代わりに メソッドを使用して結果を取得することもできますdecoded_content

もちろん、実際の URL を教えていただけると助かりますが、それができない場合もあると思います。

于 2014-10-28T18:15:53.470 に答える