3

このコードを使用して、Mapquest Traffic API から画像ファイルをダウンロードしています。

<?php
$files = glob("/root/TrafficHistory/*.gif");
$lastFileName = $files[count($files)-1];

$newFile = time() . ".gif";

$imgData = file_get_contents("http://www.mapquestapi.com/traffic/v2/flow?key=**REMOVED**&mapLat=34.05396382838673&mapLng=-118.24529104634557&mapHeight=1000&mapWidth=1000&mapScale=433342");
file_put_contents("/root/TrafficHistory/" . $newFile, $imgData);

$md5Old = md5_file($lastFileName);

if ($md5Old == md5_file("./" . $newFile)) {
    unlink("./" . $newFile);
    echo "\033[31mTraffic data same at " . time() . " aborting.\033[0m\n";
} else {
    echo "\033[32mNew traffic data downloaded to /root/TrafficHistory/" . $newFile  . " at " . time() . "\033[0m\n";
}
?>

画像の保存中にエラーが発生しても、コードは問題なく動作します。ここで見られるように、ダウンロードされたトラフィック オーバーレイfile_get_contentsが GIF 画像を完全にダウンロードしていないように見えることがわかります。問題の GIF へのリンクを次に示します (ブラウザでは正しく表示されますが、予期しないファイルの終わりを示す PhotoShop では開きません)。ダウンロードしたすべての画像がfile_get_contentsこのように表示されることに注意してください。ただし、API リンクから直接表示すると、完全に表示されます。必要に応じて、Mapquest Traffic API へのリンクもあります。ご協力いただきありがとうございます。

4

2 に答える 2

1

あなたが提供したファイルは間違いなく切り詰められています。少なくとも 8 バイト短いです。最後に宣言された長さ 168 バイトの GIF 画像データ ブロックがありますが、その時点でファイルに残っているのは 162 バイトだけです。その後も、少なくとも 0 ターミネータと、GIF「トレーラー」ブロック (バイト 0x3B) が必要です。

ブラウザーは部分的にダウンロードされた画像をレンダリングするように設計されているため、これについて文句を言うことはありませんが、画像の一番下に接する道路に、垂直線 (Firefox) または水平線のパターンがあります。 (Chrome)そこにあるべきではありません。

次のコードを実行してファイルに 8 バイトを追加すると、その部分の破損が解消され、他のプログラムでファイルを開くことも可能になります。

$data = file_get_contents('map.gif');
$data .= "\x00\x00\x00\x00\x00\x00" . "\x00" . "\x3B";
file_put_contents('map-repaired.gif', $data);

これは、ブロックを終了するための 6 (null) バイト、終了データ ブロックの長さ 0 バイト、およびトレーラー バイトです。ただし、このような大まかな修正は、他のすべての画像の一般的な解決策としては機能しません。

あなたが提供したコードに問題はありません。API のキーを持っていないので、実際にテストすることはできませんが、MapQuest の最後にバグがあるに違いないと想像することしかできません。GIF コンプレッサーが壊れているか、サーバーが間違ったContent-LengthHTTP ヘッダーを送信している可能性があります。よくわかりません。

MapQuest は画像を PNG 形式で返すことができるので、それは明らかに機能するので、それを選択してください。PNG 圧縮は常に GIF 圧縮よりも優れています (ただし、画像が非常に小さい場合 (約 100 バイト)、より複雑な PNG 形式のヘッダーにより不利になる場合を除きます)、この場合に GIF を優先する理由はありません。場合。

于 2013-12-03T04:18:08.283 に答える
0

file_get_contents()HTTP リクエストからのデータを切り捨てる他のインスタンスに遭遇しました。代わりに CURL を使用して問題を解決しました。

$url = "http://www.mapquestapi.com/traffic/v2/flow?key=**REMOVED**&mapLat=34.05396382838673&mapLng=-118.24529104634557&mapHeight=1000&mapWidth=1000&mapScale=433342";

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_TIMEOUT, 300);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 8.0; Trident/4.0)');
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$imgData = curl_exec($curl);
$http_status = curl_getinfo($curl, CURLINFO_HTTP_CODE); // You may not need this
curl_close($curl);

詳細について、または独自の CURL オプションを設定するには、PHP マニュアルを参照してください。

于 2016-12-15T14:33:17.313 に答える