кодирование урлов

230
29 марта 2022, 08:40

Надо в ресайзер картинок в цикле закидывать картинки с чужого сервера, если они "плохие", то сваливать в отдельную функцию, которая делает их "хорошими". Пример плохой картинки http://cdn.io-opt.com/images/products/ЛГ-06пр..png или http://cdn.io-opt.com/images/products/1020 СD_garbage bags_60L_40pcs.jpg. Сами картинки хорошие, плохие у них урлы.

Для ресайзера мне по-любому надо пройтись по картинке функцией get_headers(), а она такие урлы не хавает. Казалось бы всё просто: втыкнул urlencode() и порядок, но не тут то было. urlencode() все не цифро-буквенные символы, кроме -_ декодирует, в том числе и схему (протокол), это тоже легко обходится

private function urlencode($url) {
    $url='http://cdn.io-opt.com/images/products/ЛГ-06пр..png';  // тест
    $a = (string) 'https://';
    $b = (string) 'http://';
    $https = stripos($url, $a);
    $http = stripos($url, $b);
    if ($https !== false) {$num = 8; $c = $a;}
    if ($http !== false) {$num = 7; $c = $b;}
    $url = str_replace('%20',' ',$url);     //возвращаем пробелы на место 
    $url = mb_strcut($url, $num, null);     //отрезаем протокол
    $url = urlencode($url);                 //кодируем хвост
    $url = (string) $с.$url;                //возвращаем протокол на место
    print_r($url);
    //        print_r(stream_get_meta_data(fopen($url,"r")));die();
    print_r(get_headers($url));die();
    //        return $url;
}

в итоге получаем кодированный урл, но get_headers() опять его не хочет. Пробовал stream_get_meta_data(), тоже не то. Обе приведенные картинки (с русскими буквами и пробелами в урле открываются браузером). Если взять урл, который создал браузер для открытия картинки, т.е. с %20 и скормить его в get_headers(), то опять же ответ сервера 404. Не понятно, для чего вообще тогда функция urlencode() и в какой вид мне надо преобразовать урл, чтоб он обработался функцией get_headers(). Пожалуйста, подскажите.

Answer 1

Вам необходимо кодировать не всю ссылку, а только не корректную часть.
(После обработки urlencode заменяем проставленные + вместо пробелов на %20 и оба варианта ссылок будут работать корректно)
Обратите внимание на комментарии:


//$url='http://cdn.io-opt.com/images/products/1020 СD_garbage bags_60L_40pcs.jpg';
$url='http://cdn.io-opt.com/images/products/ЛГ-06пр..png';  // тест
$bz = explode('/', $url); // Разделяем на части
$last = array_pop($bz); // Получаем последнюю часть
$url1 = urlencode($last); // Кодируем её
$new = array_push($bz, $url1); //Добавляем обратно
$url2 = implode('/', $bz); // Объединяем массив обратно в строку
$url3 = str_replace('+','%20',$url2);     // заменяем + после urlencode на %20
print_r(get_headers($url3));die();

Вы можете енкодировать всё кроме основного домена, через перебор массива с нужного индекса.
Вот пример:

//$url='http://cdn.io-opt.com/images/products/1020 СD_garbage bags_60L_40pcs.jpg';
$url='http://cdn.io-opt.com/images/products/ЛГ-06пр..png';  // тест
$bz = explode('/', $url); // Разделяем на части
for ($i = 3; $i < count($bz); $i++){
    $tempUrl = urlencode($bz[$i]); // Кодируем части
    $bz[$i] = $tempUrl; //Заменяем старые части url на енкодированные
}
$url2 = implode('/', $bz); // Объединяем массив обратно в строку
print_r($url2);
$url3 = str_replace('+','%20',$url2);     // заменяем + после urlencode на %20
print_r(get_headers($url3));die();
READ ALSO
регистрация без БД

регистрация без БД

Я хочу сделать регистрацию на сайте но у меня возникли проблемы с БД

180
Обрезать часть URL в начале

Обрезать часть URL в начале

Есть ссылка https://sitecom/ru/moskov/baby/andyushak-evgeniya-petrovna

147
Как быстро сделать портфолио

Как быстро сделать портфолио

Как в кратчайшие сроки сделать портфолио? Имеется опыт в разработке под PHP 3 года, laravel - 05 года

110
Laravel + VueJS .slice is not a function

Laravel + VueJS .slice is not a function

Вообщем есть приложение Laravel + VueJS на одной странице, точнее на нескольких страницах есть пагинация сделанная таким образом:

89