リモートファイル (画像 PNG、GIF、JPG ...) をサーバーにコピーしようとしています。ファイルが存在し、基本認証も行う必要がある場合でも、copy()で404 が発生することがあるため、Guzzleを使用します。このスクリプトは、cron ジョブによってトリガーされたコマンドで起動される長いスクリプト内にあります。私は Guzzle を初めて使用し、イメージを正常にコピーしましたが、ファイルの MIME タイプが間違っています。私はここで何か間違ったことをしているに違いありません。これを行う良い方法を教えてください(コピーの成功/失敗のチェックとMIMEタイプのチェックを含む)。ファイルに MIME タイプがない場合、詳細情報とともにエラーが表示されます。
コードは次のとおりです。
$remoteFilePath = 'http://example.com/path/to/file.jpg';
$localFilePath = '/home/www/path/to/file.jpg';
try {
$client = new Guzzle\Http\Client();
$response = $client->send($client->get($remoteFilePath)->setAuth('login', 'password'));
if ($response->getBody()->isReadable()) {
if ($response->getStatusCode()==200) {
// is this the proper way to retrieve mime type?
//$mime = array_shift(array_values($response->getHeaders()->get('Content-Type')));
file_put_contents ($localFilePath , $response->getBody()->getStream());
return true;
}
}
} catch (Exception $e) {
return $e->getMessage();
}
これを行うと、MIME タイプがapplication/x-emptyに設定されます
また、ステータスが 200 と異なる場合、Guzzle は自動的に例外をスローするようです。エラーメッセージをカスタマイズできるように、この動作を停止して自分でステータスを確認するにはどうすればよいですか?
編集:これは Guzzle 3.X 用でした。Guzzle v 4.X を使用してこれを行う方法は次のとおりです (Guzzle 6 でも同様に機能します)。
$client = new \GuzzleHttp\Client();
$client->get(
'http://path.to/remote.file',
[
'headers' => ['key'=>'value'],
'query' => ['param'=>'value'],
'auth' => ['username', 'password'],
'save_to' => '/path/to/local.file',
]);
または、Guzzle ストリームを使用します。
use GuzzleHttp\Stream;
$original = Stream\create(fopen('https://path.to/remote.file', 'r'));
$local = Stream\create(fopen('/path/to/local.file', 'w'));
$local->write($original->getContents());
これはすばらしく見えます。Guzzle 4 を使用する場合、より良い/適切な解決策はありますか?