Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как правильнее будет загружать фото на сервер?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
vanya_sl
Отправлено: 24 Ноября, 2013 - 18:03:49
Post Id



Частый гость


Покинул форум
Сообщений всего: 131
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




Привет всем.
Работаю над сайтом для аренды квартир.
Возник вопрос:
Я сейчас вот так выгружают одно изображение.
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <form method="POST" enctype=multipart/form-data>
  3. <input type="file" name="image"/>
  4. <input class="btn btn-primary" type="submit" name="submit"  value="Добавить" />
  5. </form>
  6.  

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. if(isset($_POST['submit']))
  4.  
  5. {
  6.  
  7. // Каталог, в который мы будем принимать файл:
  8. $uploaddir = './files/';
  9. $uploadfile = $uploaddir.basename($_FILES['image']['name']);
  10.  
  11. // Копируем файл из каталога для временного хранения файлов:
  12. if (copy($_FILES['image']['tmp_name'], $uploadfile))
  13. {
  14. echo "<h3>Файл успешно загружен на сервер</h3>";
  15. }
  16. else { echo "<h3>Ошибка! Не удалось загрузить файл на сервер!</h3>"; exit; }
  17.  
  18.  
  19. $name_f = $_FILES['image']['name'];
  20.  
  21.                
  22.                 mysql_query("INSERT INTO `category`( `category_img`) VALUES( '$name_f')  ");
  23.                 echo "Готово!";
  24.                
  25.        
  26.                 }
  27.  
  28. ?>
  29.  

А если 5 изображений? Как лучше всего их записывать на сервер в папку и название в таблицу в БД?
Что бы админ смог самостоятельно добавлять количество фото, а не только одно.
 
 Top
dXdYdZ
Отправлено: 24 Ноября, 2013 - 18:18:14
Post Id


Посетитель


Покинул форум
Сообщений всего: 271
Дата рег-ции: Нояб. 2013  


Помог: 11 раз(а)




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

Во-вторых, Если Вы предварительно обрабатываете имя файла (например, basename), то желательно обработанное имя подставлять и в БД. Иначе можно представить случай, когда эти имена в БД и в каталоге будут разными.

В третьих, в таблице вместе с именем картинки в таблице желательно хранить и её идентификатор. Это может очень понадобиться Вам в будущем. Тип - INT AUTO_INCREMENT PRIMARY KEY NOT NULL.

Далее, имя в папке должно быть уникальным. Поэтому к имени файла в папке (и, соответственно, в таблице) надо добавлять какой-нибудь уникальный идентификатор. Чтобы не получилось, что файлы с одинаковыми именами перезапишут друг друга.
 
 Top
Deonis
Отправлено: 24 Ноября, 2013 - 18:21:51
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




Я вам уже предлагал вариант, где не нужно использовать базу, а изображения привязываются к ID статьи, поста или чего у вас там. Но вы выбрали другой вариант. Тогда есть несколько способов. Вот пара из них:
1. Хранить все пути к файлам в сериализованном виде serialize().
2. Создать отдельную таблицу, где будут всего два поля: id-статьи и путь к изображению.
Теперь, если вы выбиираете первый способ, то будете делать кучу телодвижений для того, чтоб заменить какое-то изображение: вытащить запись из БД, десериализировать, удалить из массива определенное фото, добавить туда новое, снова сериализировать и апдейтить запись в БД. Второй способ более гуманный, т.к. вы делаете один запрос на удление из доп. таблицы в зависимости от удаляемого изображения и еще один запрос, если добавляете новое фото.

Вот поэтому, я никода не храню пути к файлам в БД. В крайнем случае, храню сами изображения, но при условии, что у клиента как минимум VDS/VPS.

(Отредактировано автором: 24 Ноября, 2013 - 18:26:12)

 
 Top
vanya_sl
Отправлено: 24 Ноября, 2013 - 18:22:55
Post Id



Частый гость


Покинул форум
Сообщений всего: 131
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




dXdYdZ пишет:
Здравствуйте.
Во-первых...


Ок.
Но.. Давайте уж по сути... Как быть?
(Добавление)
Deonis
2. Создать отдельную таблицу, где будут всего два поля: id-статьи и путь к изображению.

Так я так и сделал.
Вопрос состоит в том, как запихнуть туда (в табл.) несколько фото...
 
 Top
Deonis
Отправлено: 24 Ноября, 2013 - 18:30:27
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




vanya_sl пишет:
Вопрос состоит в том, как запихнуть туда (в табл.) несколько фото...
Если вы, как говорите, так уже сделали, то какие могут быть проблемы? Одна запись - id-статьи + имя/путь к файлу. Следующая запись - следующее фото и т.д. Если у вас на одну статью десять фото, то и записей в таблице будет десять.
 
 Top
vanya_sl
Отправлено: 24 Ноября, 2013 - 18:33:47
Post Id



Частый гость


Покинул форум
Сообщений всего: 131
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




Deonis
Да но...
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <form method="POST" enctype=multipart/form-data>
  3. <input type="file" name="image"/>
  4. <input class="btn btn-primary" type="submit" name="submit"  value="Добавить" />
  5. </form>
  6.  

Я ж туда могу пихнуть только 1 фото. И собственно в табл. записать 1 название.
А если фото очень много? Тогда как сделать?
Все фото должны сразу при создании статьи загружаться.

(Отредактировано автором: 24 Ноября, 2013 - 18:36:07)

 
 Top
Deonis
Отправлено: 24 Ноября, 2013 - 18:37:40
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




vanya_sl пишет:
Я ж туда могу пихнуть только 1 фото.
Добавьте всего один атрибут в input multiple, в атрибуте name="image[]" и загружайте много. А обрабатывать их надо в цикле, т.к. это уже будет массив.

(Отредактировано автором: 24 Ноября, 2013 - 18:39:53)

 
 Top
vanya_sl
Отправлено: 24 Ноября, 2013 - 18:39:41
Post Id



Частый гость


Покинул форум
Сообщений всего: 131
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




Deonis пишет:
vanya_sl пишет:
Я ж туда могу пихнуть только 1 фото.
Тобавьте всего один атрибут в input multiple, в атрибуте name="image[]" и загружайте много. А обрабатывать их надо в цикле, т.к. это уже будет массив.

\
Можете кодом показать? Как?

CODE (html):
скопировать код в буфер обмена
  1.  
  2. <input type="file" multiple name="image" />
  3.  


А на ПХП как?

(Отредактировано автором: 24 Ноября, 2013 - 18:41:45)

 
 Top
Deonis
Отправлено: 24 Ноября, 2013 - 18:45:17
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




vanya_sl пишет:
Можете кодом показать?
Ну вы даете ))
PHP:
скопировать код в буфер обмена
  1. for($i=0; $i < count($_FILES['image']['tmp_name']);$i++){
  2.     if($_FILES['image']['error'][$i] == 0){
  3.         if(move_uploaded_file($_FILES['image']['tmp_name'][$i], $target_path)){
  4.             // тут можно сохранять в массив загруженные фото, для последующей записи в БД
  5.         }
  6.     }
  7. }
 
 Top
vanya_sl
Отправлено: 24 Ноября, 2013 - 19:04:54
Post Id



Частый гость


Покинул форум
Сообщений всего: 131
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




Deonis пишет:
vanya_sl пишет:
Можете кодом показать?
Ну вы даете ))
PHP:
скопировать код в буфер обмена
  1. for($i=0; $i < count($_FILES['image']['tmp_name']);$i++){
  2.     if($_FILES['image']['error'][$i] == 0){
  3.         if(move_uploaded_file($_FILES['image']['tmp_name'][$i], $target_path)){
  4.             // тут можно сохранять в массив загруженные фото, для последующей записи в БД
  5.         }
  6.     }
  7. }

спс.
но у меня не получаеться так.... можно подробнее?
 
 Top
Deonis
Отправлено: 24 Ноября, 2013 - 20:00:57
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




vanya_sl пишет:
но у меня не получаеться так...
Тут бы не помешало указать, что именно не получается, если есть ошибка, то и её показать.
PHP:
скопировать код в буфер обмена
  1.  
  2. function changeName($file){
  3.     $file_parts = pathinfo($file);
  4.     return md5($file_parts['filename'].time()).'.'.$file_parts['extension'];
  5. }
  6. $uploaddir = './files/';
  7. $file_array = array();
  8. for($i=0; $i < count($_FILES['image']['tmp_name']);$i++){
  9.     if($_FILES['image']['error'][$i] == 0){
  10.         $new_filename = changeName($_FILES['image']['tmp_name'][$i]);
  11.         if(move_uploaded_file($_FILES['image']['tmp_name'][$i], $uploaddir.$new_filename)){
  12.             $file_array[] = $new_filename;
  13.         }
  14.     }
  15. }
  16. if(count($file_array) > 0){
  17.     $query = "INSERT INTO `table` (`artical_id`, `filename`) VALUE ";
  18.     foreach($file_array as $val){
  19.         $query .= '('.$art_id.','.$val.'),';
  20.     }
  21.     $query = rtrim($query,','); // в $query у вас подготовленный запрос
  22. }
 
 Top
vanya_sl
Отправлено: 24 Ноября, 2013 - 20:01:00
Post Id



Частый гость


Покинул форум
Сообщений всего: 131
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




Все .. уже сделал сам. Всем спасибо.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB