Перейти к содержимому


Фото
- - - - -

Фиксы для изображений


  • Чтобы отвечать, сперва войдите на форум
24 ответов в теме

#1 a13x

a13x
  • Забаненый
  • 213 сообщений
  • Дизайн, Программирование, Верстка, SEO, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 06.01.2018 - 15:15

1. Переименование загружаемого файла по урл (чтобы не заменялись файлы)

2. Корректная загрузка изображения при указании ссылки как исчтоника

3. Проверка на изображение

Всем кому не нужны эти фиксы проходим мимо.

 

1 и 3. заменить метод upload_image в классе Image.php на этот. изменений тут минимум, просто местами кое что поменял, добавил копирование через copy для п.2, и добавил не обязательный 3-ий аргумент - новое имя файла.

    public function upload_image($filename, $name, $nn = false)
    {
        //проверяем изображение на содержимое и получаем расширение файла
        $type = $this->image_check($filename);
        if(!$type)
            return false;

        // Имя оригинального файла
        $name = $this->correct_filename($name);
        $uploaded_file = pathinfo($name, PATHINFO_BASENAME);

        //если третий аргумент не указан, то берем название файла пользовательское, иначе третий аргумент
        $base = (!$nn ? pathinfo($uploaded_file, PATHINFO_FILENAME) : $nn);
        $ext = pathinfo($uploaded_file, PATHINFO_EXTENSION);
        //если файл закачивается по ссылке и в ссылке нет конечного расширения файла
        //то берем из метода выше
        if(!$ext)
            $ext = $type;
        $new_name = (!$nn ? $uploaded_file : $nn).".".$ext;

        if(in_array(strtolower($ext), $this->allowed_extentions)){
            while(file_exists($this->config->root_dir.$this->config->original_images_dir.$new_name)){
                $new_base = pathinfo($new_name, PATHINFO_FILENAME);
                if(preg_match('/_(\d+)$/', $new_base, $parts))
                    $new_name = $base."_".($parts[1]+1).".".$ext;
                else
                    $new_name = $base."_1.".$ext;
            }
            $destfile = $this->config->root_dir.$this->config->original_images_dir.$new_name;
            is_uploaded_file($filename) ? move_uploaded_file($filename, $destfile) : copy($filename, $destfile);
            return $new_name;
        }
        return false;
    }
 

Также, чтобы сработала проверка на изображение надо добавить новый метод (или отключить её если она вам не нужна).

 

    public function image_check($file){
        $handle = fopen($file, 'r');                //открываем файл
        $contents = fread($handle, 10);                //читаем 10 байт
        fclose($handle);                            //закрываем файл
        $pos["jpg"] = strpos($contents, "Exif");    //1-ая проверка: на jpeg формат
        $pos["jpeg"] = strpos($contents, "JFIF");    //2-ья проверка: на jpeg формат
        $pos["png"] = strpos($contents, "PNG");        //3-ая проверка: на PNG формат
        $pos["gif"] = strpos($contents, "GIF89");    //4-ая проверка: на GIF формат
        foreach($pos AS $type=>$check)
            if($check !== false)                    //если хотя бы 1 проверка сработала
                return $type;                        //то всё ОК
        return false;
    }

Далее в файле /simpla/ProductAdmin.php найти строку

 

if ($image_name = $this->image->upload_image($images['tmp_name'][$i], $images['name'][$i]))

и в неё дописать третий аргумент - новое имя для файла, а именно $product->url

 

if ($image_name = $this->image->upload_image($images['tmp_name'][$i], $images['name'][$i], $product->url))

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

 

2. Чуть ниже кода что описан выше (/simpla/ProductAdmin.php) найти

 

    if(!empty($url) && $url != 'http://' && strstr($url,'/')!==false)
        $this->products->add_image($product->id, $url); 

и заменить его на

if(!empty($url))
{
    $namearr = explode("/", $url);
    $name = end($namearr);
    $ext = pathinfo($name, PATHINFO_EXTENSION);
    $data = @file_get_contents($url);
    if(strlen($data) > 0)
    {
        $tmpfname = tempnam(sys_get_temp_dir(), "img");
        file_put_contents($tmpfname, $data);
        $filename = $this->image->upload_image($tmpfname, $name, $product->url);
        unlink($tmpfname);
        $this->products->add_image($product->id, $filename);
    }
} 

Изменено: a13x, 06.01.2018 - 15:38


#2 a13x

a13x
  • Забаненый
  • 213 сообщений
  • Дизайн, Программирование, Верстка, SEO, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 06.01.2018 - 15:20

В идеале конечно дописать проверку на метаданные в картинках, может позже это сделаю.



#3 Maksclub

Maksclub

    Помогаю с Симплой и c PHP

  • Фрилансер
  • 1 344 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 06.01.2018 - 15:22

я правильно понимаю, что вы решили проблему с https и с русскими названиями?



#4 a13x

a13x
  • Забаненый
  • 213 сообщений
  • Дизайн, Программирование, Верстка, SEO, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 06.01.2018 - 15:27

я правильно понимаю, что вы решили проблему с https и с русскими названиями?

А что была за проблема с https ? Если указание ссылки через https то это роли не сыграет, скрипт забирает данные через file_get_contents.

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

Можете дать пару ссылок я протестирую.


Изменено: a13x, 06.01.2018 - 15:28


#5 a13x

a13x
  • Забаненый
  • 213 сообщений
  • Дизайн, Программирование, Верстка, SEO, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 06.01.2018 - 15:32

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

Fixed


Изменено: a13x, 06.01.2018 - 15:39


#6 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 6 520 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 06.01.2018 - 15:54

Ой зря выложил, сейчас припрется Корс и такую вонь поднимет, что до следующего года не выветрить.

#7 a13x

a13x
  • Забаненый
  • 213 сообщений
  • Дизайн, Программирование, Верстка, SEO, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 06.01.2018 - 16:18

как говорится "собаки лают, караван идёт" :D



#8 a13x

a13x
  • Забаненый
  • 213 сообщений
  • Дизайн, Программирование, Верстка, SEO, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 06.01.2018 - 16:48

Проверку на дропнутые изображения (через drag n drop), лучше внести в проверку на пустой урл.

Вобщем должно получиться вот так (просмотрел я этот фрагмент):

 

// Загрузка изображений из интернета и drag-n-drop файлов
if($images = $this->request->post('images_urls')){
    foreach($images as $url){
        // Если не пустой адрес и файл не локальный
        if(!empty($url)){
            if($dropped_images = $this->request->files('dropped_images')){
                $key = array_search($url, $dropped_images['name']);
                if ($key!==false && $image_name = $this->image->upload_image($dropped_images['tmp_name'][$key], $dropped_images['name'][$key], $product->url))
                     $this->products->add_image($product->id, $image_name);
            }
            $namearr = explode("/", $url);
            $name = end($namearr);
            $ext = pathinfo($name, PATHINFO_EXTENSION);
            $data = @file_get_contents($url);
            if(strlen($data) > 0){
                $tmpfname = tempnam(sys_get_temp_dir(), "img");
                file_put_contents($tmpfname, $data);
                $filename = $this->image->upload_image($tmpfname, $name, $product->url);
                unlink($tmpfname);
                $this->products->add_image($product->id, $filename);
            }
        }
    }
} 

p.s. ну и в проверке на изображения драгндроп тоже надо дописать новое имя файла в метод upload_image (в этом посте уже добавлено)


Изменено: a13x, 06.01.2018 - 16:52


#9 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 6 520 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 06.01.2018 - 16:56

Вы упустили один момент, функция resize_modifier (api/Design.php) не работает с https, её тоже нужно расширить, и ещё в функции resize (api/Image.php) тот же самый момент.

#10 Плохиш

Плохиш
  • Забаненый
  • 98 сообщений
  • Программирование
  • Версия CMS:2.x
  • Откуда:Орел

Опубликовано 06.01.2018 - 17:14

доработка изменяет в  simpla/ProductAdmin.php  строки
 
							if(!empty($url) && $url != 'http://' && strstr($url,'/')!==false)
					 			$this->products->add_image($product->id, $url);

 

А чуть ниже  есть подобный фрагмент
 
                             elseif($dropped_images = $this->request->files('dropped_images'))
                              {
.........
                                                 $this->products->add_image($product->id, $image_name);
                            }

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



#11 a13x

a13x
  • Забаненый
  • 213 сообщений
  • Дизайн, Программирование, Верстка, SEO, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 06.01.2018 - 20:09

Вы упустили один момент, функция resize_modifier (api/Design.php) не работает с https, её тоже нужно расширить, и ещё в функции resize (api/Image.php) тот же самый момент.

Изображение копируется к вам на сервер. Мне кажется неправильным брать
ссылки на другой источник и вставлять к себе в базу. А если изображение
удалится? Изменится путь? Что тогда?

 

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

хмм... у меня там другой фрагмент

 

                       // Загрузка изображений из интернета и drag-n-drop файлов
                      if($images = $this->request->post('images_urls'))
                      {
                        foreach($images as $url)
                        {
                            // Если не пустой адрес и файл не локальный
                            if(!empty($url) && $url != 'http://' && strstr($url,'/')!==false)
                                 $this->products->add_image($product->id, $url);
                             elseif($dropped_images = $this->request->files('dropped_images'))
                              {
                                 $key = array_search($url, $dropped_images['name']);
                                 if ($key!==false && $image_name = $this->image->upload_image($dropped_images['tmp_name'][$key], $dropped_images['name'][$key]))
                                                 $this->products->add_image($product->id, $image_name);
                            }
                        }
                    }
 

симпла, посл. версия.


Изменено: a13x, 06.01.2018 - 20:27


#12 Плохиш

Плохиш
  • Забаненый
  • 98 сообщений
  • Программирование
  • Версия CMS:2.x
  • Откуда:Орел

Опубликовано 06.01.2018 - 20:38

Изображение копируется к вам на сервер. Мне кажется неправильным брать
ссылки на другой источник и вставлять к себе в базу. А если изображение
удалится? Изменится путь? Что тогда?

 

Это неправильно лишь теоретически. А практически, если вставляете изображение в админке на странице товара, то при сохранении чужой URL картинки сразу же перепишется на свой. Проблемы такого плана возникают лишь после импорта, обмена с 1С и подобных объемных операций, например:

http://forum.simplac...ии-картинки-то/



#13 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 6 520 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 06.01.2018 - 20:38

Изображение копируется к вам на сервер. Мне кажется неправильным брать
ссылки на другой источник и вставлять к себе в базу. А если изображение
удалится? Изменится путь? Что тогда?

Это здесь не при чем, в image.php есть доп. функция которая грузит удаленный файл на ваш сервер, а не тупо копирует путь к файлу в БД.

#14 Kosjak76

Kosjak76
  • Модератор
  • 3 728 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 06.01.2018 - 20:43

Не проще ли загружать изображение на сервер при СОХРАНЕНИИ товара, ане при РЕСАЙЗЕ?

Вроде ничем не сложнее? Может, я не прав?

Недавно столкнуся с этим... Зачем именно так сделано?



#15 a13x

a13x
  • Забаненый
  • 213 сообщений
  • Дизайн, Программирование, Верстка, SEO, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 06.01.2018 - 21:54

Это неправильно лишь теоретически. А практически, если вставляете
изображение в админке на странице товара, то при сохранении чужой URL
картинки сразу же перепишется на свой.

А картинка тоже сразу к вам в папку запишется или останется удаленно? А если её удалят / изменят название что будет у вас? Это уже неправильный подход.

 

Это здесь не при чем, в image.php есть доп. функция которая грузит
удаленный файл на ваш сервер, а не тупо копирует путь к файлу в БД.

Эта функция вызывается когда человек указал урл? нет. Значит и толку от этой функции ноль.

+ эта функция почти дублирует весь функционал upload_image, проще было
добавить 1 необязательный аргумент и всё бы заработало без доп. метода
download_image.


 

Не проще ли загружать изображение на сервер при СОХРАНЕНИИ товара, ане при РЕСАЙЗЕ?

Вроде ничем не сложнее? Может, я не прав?

Недавно столкнуся с этим... Зачем именно так сделано?

Я реализовал именно при сохранении товара.


Изменено: a13x, 06.01.2018 - 22:00


#16 Плохиш

Плохиш
  • Забаненый
  • 98 сообщений
  • Программирование
  • Версия CMS:2.x
  • Откуда:Орел

Опубликовано 07.01.2018 - 09:25

А картинка тоже сразу к вам в папку запишется или останется удаленно? А если её удалят / изменят название что будет у вас? Это уже неправильный подход.

 
На странице товара после сохранения страница перезагрузится с новыми данными. При этом отработает ресайз новой картинки. А при ресайзе уже сам файл изображения перепишется в свою папку со стороннего сайта, сторонний URL в базе заменится на локальный.  Следов стороннего URL на сайте совсем не останется. Это все - в течение считанных секунд. И бюрократизм типа "А если её удалят" тут не уместен...



#17 a13x

a13x
  • Забаненый
  • 213 сообщений
  • Дизайн, Программирование, Верстка, SEO, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 07.01.2018 - 23:17

 
На странице товара после сохранения страница перезагрузится с новыми данными. При этом отработает ресайз новой картинки. А при ресайзе уже сам файл изображения перепишется в свою папку со стороннего сайта, сторонний URL в базе заменится на локальный.  Следов стороннего URL на сайте совсем не останется. Это все - в течение считанных секунд. И бюрократизм типа "А если её удалят" тут не уместен...

Это всё с ваших слов, по факту при попытке загрузить изображение я получал на странице товара битую картинку, при наводе на которую был битый путь http://simplacms.ru/.../targetsite.com что-то типа такого. Особо разбираться что там и когда произойдёт у меня желания небыло. То что я увидел было уже неправильно. Если вас устраивает некорректная работа скрипта - ваше дело.

 

p.s. тестировал на посл. версии симпла.

 

p.p.s

http://simpla-url-re...-iphone-4s-16gb

вот, загрузил изображение по ссылке, когда ожидать подхват изображение и копирование в нужные папки?


Изменено: a13x, 07.01.2018 - 23:21


#18 a13x

a13x
  • Забаненый
  • 213 сообщений
  • Дизайн, Программирование, Верстка, SEO, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 07.01.2018 - 23:31

На странице товара после сохранения страница перезагрузится с новыми данными. При этом отработает ресайз новой картинки.

Кто вам это сказал? :lol: метод add_image просто добавляет имя файла в БД, не более того, а метод upload_image работает только с загружаемыми файлами.


Изменено: a13x, 07.01.2018 - 23:34


#19 Плохиш

Плохиш
  • Забаненый
  • 98 сообщений
  • Программирование
  • Версия CMS:2.x
  • Откуда:Орел

Опубликовано 08.01.2018 - 10:42

p.p.s
http://simpla-url-re...-iphone-4s-16gb
вот, загрузил изображение по ссылке, когда ожидать подхват изображение и копирование в нужные папки?

 

Попробовал расшифровать Ваш сумбур.
Если на стандартном демо сайте загружаю на странице товара через "загрузить из интернета" по ссылке
http://soft-soft.ws/...tztn824jnd.jpeg
то картинка сразу же появляется...

 

Если б Вы догадались открыть отдельно ссылку картинки

http://simpla-url-re...164dbb6567a68c9
то увидели бы там сообщение: bad token
Должно быть, Вы на своем сайте сами что-то наворочали...

Если хотите сказать, что в стандартной Simpla c этим что-то неверно, то надо давать точный конкретный пример, который можно повторить на демо-сайте Simpla http://demo.simplacms.ru/....


 



#20 Плохиш

Плохиш
  • Забаненый
  • 98 сообщений
  • Программирование
  • Версия CMS:2.x
  • Откуда:Орел

Опубликовано 08.01.2018 - 10:47

Кто вам это сказал? :lol: метод add_image просто добавляет имя файла в БД, не более того, а метод upload_image работает только с загружаемыми файлами.

 

Неужто Вы несогласны с высказанным утверждением, что "На странице товара после сохранения страница перезагрузится с новыми данными. При этом отработает ресайз новой картинки." ? 






0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых