Перейти к содержанию
Официальный форум поддержки Simpla

Загрузка изображений по URL на хостинг во время импорта


Рекомендуемые сообщения

В данном решении предусмотрена проверка на ссылки с пустым изображением, т.е. часто бывает такое, что ссылка рабочая, но изображения нет. Так же предусмотрена загрузка с серверов, которые некорректно реагируют на прямое копирование изображения, пришлось делать через curl

В файле simpla/ajax/import.php

            // Изображения товаров
            if(isset($item['images']))
            {
                 Это всё условие, вместе с телом, нужно полностью заменить!
            }

Меняем на:

            // Изображения товаров
            if(isset($item['images']))
            {
                // Изображений может быть несколько, через запятую
                $images = explode(',', $item['images']);
                foreach($images as $image)
                {
                    $image = trim($image);
                    $size_f = 0;
                    $data_x = get_headers($image, true);
                    $size_f = isset($data_x['Content-Length'])?(int) $data_x['Content-Length']:0;
                    if(!empty($image) && $size_f>0)
                    {
                        if(strpos($image, 'http') !== false) {
                            $image = $this->image->download_image_from_site($image);
                        }
                       
                        // Имя файла
                        $image_filename = pathinfo($image, PATHINFO_BASENAME);
                       
                        // Добавляем изображение только если такого еще нет в этом товаре
                        $this->db->query('SELECT filename FROM __images WHERE product_id=? AND (filename=? OR filename=?) LIMIT 1', $product_id, $image_filename, $image);
                        if(!$this->db->result('filename'))
                        {
                            $this->products->add_image($product_id, $image);
                        }
                    }
                }
            }

Далее нужно создать новую функцию в файле api/Image.php

public function download_image_from_site($url, $type = 'copy') {      
        if($type == 'copy') {
            $name = $this->correct_filename(pathinfo($url, PATHINFO_BASENAME));
            $base = pathinfo($url, PATHINFO_FILENAME);
            $ext = pathinfo($url, PATHINFO_EXTENSION);
           
            if(in_array(strtolower($ext), $this->allowed_extentions))
            {
                while(file_exists($this->config->root_dir.$this->config->original_images_dir.$name))
                {    
                    $name = pathinfo($name, PATHINFO_FILENAME);
                    if(preg_match('/_([0-9]+)$/', $name, $parts))
                        $name = $base.'_'.($parts[1]+1).'.'.$ext;
                    else
                        $name = $base.'_1.'.$ext;
                }
                $file = fopen($this->config->root_dir.$this->config->original_images_dir.$name, 'w');
                $user_agent = "Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)";
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_FILE, $file);
                curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
                curl_setopt($ch, CURLOPT_HEADER, false);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
                curl_setopt($ch, CURLOPT_POST, 0);
                $result = curl_exec($ch);
                curl_close($ch);
                fclose($file);
                return $name;
            }
            return false;
        }
        return false;
    }

На этом все. 

Ссылка на сообщение
Поделиться на другие сайты
3 часа назад, Noxter сказал:

И положим сервак с такими кодерами :D

Зависит от прямоты/кривизны рук. У меня в основном работает.

Некоторые недостатки есть, куда ж без них? Например, если в поле изображений стоит 'image_http.jpg', то импорт дает ошибку.

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

Ссылка на сообщение
Поделиться на другие сайты
6 часов назад, Noxter сказал:

Загрузи 20к товаров по 5-10 фоток в 4к разрешении, посмотрим)

а как правильно загружать такое количество фоток?

Ссылка на сообщение
Поделиться на другие сайты

В Simpla это сделано стандартно - реальная загрузка распределенная, каждое фото загружается отдельно в тот момент, когда оно (впервые) запрашивается.

Если хотите сразу, то решать вопрос по аналогии с тем, как перевезти 200 человек, если есть только один обычный легковой автомобиль - дополнительными ухищрениями...

Ссылка на сообщение
Поделиться на другие сайты
  • 2 недели спустя...

Корректировка

В файле simpla/ajax/import.php нужно условие чуть по другому написать. Не все удаленные серверы дают данные по прошлому условию. В общем вот так будет проще и правильнее условие

// Изображения товаров
            if(isset($item['images']))
            {
                // Изображений может быть несколько, через запятую
                $images = explode(',', $item['images']);
                foreach($images as $image)
                {
                    $image = trim($image);
                    if (@getimagesize($image))
                    {
                        if(strpos($image, 'http') !== false) {
                            $image = $this->image->download_image_from_site($image);
                        }
                       
                        // Имя файла
                        $image_filename = pathinfo($image, PATHINFO_BASENAME);
                       
                        // Добавляем изображение только если такого еще нет в этом товаре
                        $this->db->query('SELECT filename FROM __images WHERE product_id=? AND (filename=? OR filename=?) LIMIT 1', $product_id, $image_filename, $image);
                        if(!$this->db->result('filename'))
                        {
                            $this->products->add_image($product_id, $image);
                        }
                    }
                }
            }

 

Ссылка на сообщение
Поделиться на другие сайты
В 13.12.2021 в 22:24, Noxter сказал:

Загрузи 20к товаров по 5-10 фоток в 4к разрешении, посмотрим)

Вопрос не в том, что нужен ли такой функционал. Заказчики разные, иногда странные. В данном конкретном случае грузят по чуть-чуть, предупреждены о всех минусах загрузки больших порций и все таки решили что "ну вот надо и все тут".

Тут не решается вопрос целесообразности такого механизма, тут решается вопрос реализации такого механизма

Ссылка на сообщение
Поделиться на другие сайты
В 14.12.2021 в 15:29, phukortsin сказал:

В Simpla это сделано стандартно - реальная загрузка распределенная, каждое фото загружается отдельно в тот момент, когда оно (впервые) запрашивается.

Если хотите сразу, то решать вопрос по аналогии с тем, как перевезти 200 человек, если есть только один обычный легковой автомобиль - дополнительными ухищрениями...

Да, есть. И:

  1. По умолчанию этот механизм глючит и не все картинки прогружает, проверено.. Т.е. нужно дорабатывать
  2. Покупатель заходит на страницу товара и хочет видеть картинку, а не ждать когда она прогрузится.. А админу сайта прогружать каждую карточку товара самостоятельно на сайте - то еще занятие

В целом я соглашусь, что прямая загрузка картинок по url это так себе идея. Но тут вовсе так себе идя загрузки картинок по url такими импортами. В идеале нужен парсинг не только товаров и урлов картинок, но и самих картинок, и пускай эта нагрузка ложится на парсинг. А уже готовый прайс с физическимикартинками импортировать по человечески.

А всегда ли все получается так, как нужно или как мы хотим?

Это я к философскому вопросу о целесообразности предложенного механизма, раз была поднята тема рассуждений.

Ссылка на сообщение
Поделиться на другие сайты
В 13.12.2021 в 21:35, phukortsin сказал:

Зависит от прямоты/кривизны рук. У меня в основном работает.

Некоторые недостатки есть, куда ж без них? Например, если в поле изображений стоит 'image_http.jpg', то импорт дает ошибку.

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

Благодарю, хорошее замечание, упустил момент :(

Ссылка на сообщение
Поделиться на другие сайты

Так, в ходе тестов еще один косяк замечен. При загрузке картинок из папки originals проверка на размер изображения (которая исключается загрузку пустых картинок, да да, такие есть, открываешь ссылку - там картинка есть, но ее длина 0, просто ничего нет, но картинка есть, 404 ошибки не выдает)

В общем, вот снова исправленный вариант, с учетом загрузки локальных файлов изображений, и с учетом замечания phukortsin про http в именах файлов

// Изображения товаров
            if(isset($item['images']))
            {
                // Изображений может быть несколько, через запятую
                $images = explode(',', $item['images']);
                foreach($images as $image)
                {
                    $image = trim($image);      
                    if(strpos($image, 'http://') !== false || strpos($image, 'https://') !== false) {
                        if (@getimagesize($image)) {
                            $image = $this->image->download_image_from_site($image);
                        }
                    }
                       
                        // Имя файла
                        $image_filename = pathinfo($image, PATHINFO_BASENAME);
                       
                        // Добавляем изображение только если такого еще нет в этом товаре
                        $this->db->query('SELECT filename FROM __images WHERE product_id=? AND (filename=? OR filename=?) LIMIT 1', $product_id, $image_filename, $image);
                        if(!$this->db->result('filename'))
                        {
                            $this->products->add_image($product_id, $image);
                        }
 
                }
            }

 

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

1. проверку на ссылку изображений лучше сделать регуляркой вместо explode, ибо с ней неважно как будут разбиты ссылки, по запятой, точке запятой или переносу строки

2. не обязятельно использовать CURL, file_get_contents тоже отлично работает, а CURL это отдельная бибилиотека которая может быть не включена.

3. кто мешет проверять на размер после скачки файла через strlen? кода меньше, результат тот же. (скачать нулевой файл или же запросить заголовки - по времени одно и тоже)

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...