Обработка 404 ошибок при загрузке изображения - PullRequest
2 голосов
/ 02 июля 2019

Я пытаюсь загрузить изображения с сервера, но иногда изображения не обнаруживаются (сервер возвращает «404»), поэтому я хочу загрузить изображение-заполнитель или просто пропустить этот URL-адрес изображения. Теперь у меня есть:

foreach($images as $image){

    $handle = curl_init($image);
    curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);

    $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
    if($httpCode == 404) {
        $image = "https://placehold.it/1200x800";
    }
    curl_close($handle);

    $http_client = new Client(array(
        'base_uri' => '',
        'verify' => false,
    ));

    try {
        $res = $http_client->get($image);
        $name = substr($image, strrpos($image, '/') + 1);
        Storage::put($vendor_code."/".$name, $res->getBody());

    } catch (Exception $ex) {
        \Log::error($ex);
    }
}

Но даже в этом случае я получаю исключение, что изображение не найдено

Любая помощь, пожалуйста?

Спасибо

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

Я попробовал ваш код, и ответ $ httpCode всегда будет равен 0, потому что вы фактически никогда не выполняете curl. Попробуйте это после строки curl_setopt, например:

curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
curl_exec($handle); 
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
0 голосов
/ 02 июля 2019

Из документов есть два поддерживаемых способа загрузки файла:

Передайте строку, чтобы указать путь к файлу, в котором будет храниться содержимое тела ответа:

$client->request('GET', '/stream/20', ['sink' => '/path/to/file']);

Передайте ресурс, возвращенный из fopen (), чтобы записать ответ в поток PHP:

$resource = fopen('/path/to/file', 'w');
$client->request('GET', '/stream/20', ['sink' => $resource]);

Третий вариант, использующий 'save_to' - устарел :

Передайте объект Psr \ Http \ Message \ StreamInterface для потоковой передачи тела ответа в открытый поток PSR-7.

$resource = fopen('/path/to/file', 'w');
$stream = GuzzleHttp\Psr7\stream_for($resource);
$client->request('GET', '/stream/20', ['save_to' => $stream]);

Узнайте больше о Guzzle Sink .

...