Загрузите удаленный файл, используя laravel - PullRequest
1 голос
/ 19 февраля 2020

У меня есть ссылка, которая получает изображение, но изображение было удалено, переименовано или перемещено в другое место

public function index()
{    
    $array = [
         { image:'https://imgimob.sobressai.com.br/fotos/765/475139/12768822_g.jpg' },
         { image:'http://imgimob.sobressai.com.br/fotos/765/475140/12768824_g.jpg' }
    ]    
    for ($i = 0; $i < count($array); $i++) {
       if(!$contents = file_get_contents($array[$i]['image'])) 
       {
             return 'Not found!';
       else {
        Storage::disk('public')->put('default/teste.jpg', $contents); 
       } 
   }
}

если изображение не существует, я получаю эту ошибку

file_get_contents(http://imgimob.sobressai.com.br/fotos/765/475140/12768824_g.jpg): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found

Я хотел бы получить ссылку, чтобы вернуть "не существует" и загрузить файл, если он есть.

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Вы неправильно обрабатываете предупреждение . Вы не можете просто использовать ! в своем if / else утверждении.

(я предполагаю, что вы используете laravel с методами, описанными выше.)

Вы придумали что-то вроде функции / метода для этого. Вы можете сделать это следующим образом:

private function checkImage($url)
{
    $valid_types = ['image/png', 'image/jpeg']; // add more valid types that you want and so on
    $client = new \GuzzleHttp\Client();
    try {
        $response = $client->head($url);
        return
            !empty($response->getHeaders()['Content-Type'][0]) &&
            in_array($response->getHeaders()['Content-Type'][0], $valid_types, true);

    } catch (\Exception $e) {
        return false;
    }
}

Тогда, наконец, просто используйте метод в своем классе:

$url = 'https://imgimob.sobressai.com.br/fotos/765/475140/12768824_g.jpg';
$exists = $this->checkImage($url);
echo $exists ? 'yay!' : 'does not exist'; // or do the echo inside the function whichever you prefer

Я использовал описанный выше метод ->head, чтобы просто проверить и не включать body.

Редактировать:

В целях фактической загрузки файла. Просто используйте тот же код выше, вместе с вашим Storage методом сохранения, чтобы сохранить изображение. Использование ->get():

$url = 'https://imgimob.sobressai.com.br/fotos/765/475139/12768822_g.jpg';
$valid_types = ['image/png', 'image/jpeg']; // add more valid types that you want and so on
$client = new \GuzzleHttp\Client();
try {
    $response = $client->get($url);
    if (
        !empty($response->getHeaders()['content-type'][0]) &&
        in_array($response->getHeaders()['content-type'][0], $valid_types, true)
    ) {
        Storage::disk('public')->put('default/teste.jpg', $response->getBody()->getContents());
    }

} catch (\Exception $e) {
    echo 'does not exist';
}
0 голосов
/ 19 февраля 2020

Если вы уверены, что файл существует, это проблема с правами доступа. Проверьте владельца файла и режим, которые вы ожидаете. (отредактировано)

Кроме того, убедитесь, что ваш PHP настроен с включенным allow-url-fopen. Это позволит PHP открывать удаленные файлы. Узнайте больше на https://www.php.net/manual/en/filesystem.configuration.php#ini .allow-url-fopen

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...