Я пытаюсь скопировать удаленный файл (изображение PNG, GIF, JPG...) на мой сервер. Я использую Guzzle, так как иногда получаю 404 с copy(), даже если файл существует, и мне также нужно сделать базовый auth. Этот script находится в длинном script запущенном в команде, вызванном заданием 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 автоматически генерирует исключение. Как я могу остановить это поведение и проверить статус самостоятельно, чтобы я мог настраивать сообщение об ошибке?
EDIT: Это было для 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',
]);
Или используя поток Gzzle:
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?