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]   

> Без описания
shkarbatov
Отправлено: 11 Августа, 2011 - 19:08:34
Post Id



Новичок


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


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




Специалисты, подскажите пожалуйста в рещении проблемы.

Задача:
- необходимо загружать на сервер файлы только определенного типа;
- размер загружаемых файлов не должен превышать 20 Мб;
- если файл меньше 20 Мб и соответствует разрешенному типу формируется письмо с текстом и отправляется на почту
- если файл больше 20 Мб или не соответствует разрешенному типу формируется письмо с текстом об ошибке и отправляется на почту
- если файл больше 20 Мб, тогда не надо ждать пока он загрузится на сервер (этого пока нет, пробывал с полем hidden, но что-то не получается)

В принципе все реализовано, вот только есть одно НО!

Если файл больше 20 Мб, тогда сервер ждет его полной загрузки, и при формировании письма, он отправляет на почту абсолютно пустое письмо без текста и темы.

Подскажите пожалуйста, как реализовать проверку размера файла, что-бы не ждать его полной загрузки на сервер, и объяснить, или показать на мою ошибку, почему если файл больше 20 Мб такое происходит.

upload_max_filesize => 32M => 32M

Текст письма содержится в переменной $message.

Заранее благодарен!

-------------------------------- ------------------------
Есть html-форма:

CODE (html):
скопировать код в буфер обмена
  1. <form id="form1" action="send_email.php" method="post" enctype="multipart/form-data">
  2.         <input type="file" name="filename">
  3.         <input type="button" value="Загрузить" onClick="tr();">
  4. </form>

-------------------------------- ------------------------
Серверная часть:

PHP:
скопировать код в буфер обмена
  1. // Проверка файла на размер
  2.   if($_FILES["filename"]["size"] > 1024*20*1024)
  3. {
  4.         echo ("Размер файла превышает 20 мегабайт");
  5.         $message .= "\r\n\r\n\r\nФайл загрузить на сервер не удалось, так как он превышает допустимый размер - 20 МБ.";
  6.         mail($to, $subject, $message, $headers);
  7.         echo "<meta http-equiv='refresh'; content='5; url=/index.php?option=com_content&view=article&id=198&Itemid=232'>";      
  8.  
  9. // Проверяем загружен ли файл
  10. if(is_uploaded_file($_FILES["filename"]["tmp_name"]))
  11. {
  12.         // Если файл загружен успешно, перемещаем его из временной директории в конечную
  13.         if (copy($_FILES['filename']['tmp_name'], $uploadfile))
  14.         {
  15.         echo "<p>Файл успешно загружен на сервер</p>";
  16.         $message .= "\r\n\r\n\r\nФайл успешно загружен на сервер.";
  17.         mail($to, $subject, $message, $headers);
  18.         echo "<meta http-equiv='refresh'; content='5; url=/index.php'> ";
  19.         }
  20. else  
  21.         {
  22.         echo("<p>Ошибка! Не удалось загрузить файл на сервер, попробуйте повторить попытку позже!</p>");
  23.         $message .= "\r\n\r\n\r\nФайл загрузить на сервер не удалось.";                                        
  24.         mail($to, $subject, $message, $headers);
  25.         echo "<meta http-equiv='refresh'; content='5; url=/index.php?option=com_content&view=article&id=198&Itemid=232'>";                     
  26.         }
  27. }
  28.  
  29. // Проверка на несоответсвие типа
  30. elseif ($type !== "jpg")
  31. {      
  32.     echo ("Файл не соответствует разрешенному формату");
  33.         $message .= "\r\n\r\n\r\nФайл загрузить на сервер не удалось, так как он не соответствует разрешенному формату.";
  34.         mail($to, $subject, $message, $headers);
  35.         echo "<meta http-equiv='refresh'; content='5; url=/index.php?option=com_content&view=article&id=198&Itemid=232'> ";    
  36. }
  37.  
  38. }
  39. else
  40. {
  41.         $asd = mail($to, $subject, $message, $headers);
  42. }
 
 Top
Мелкий Супермодератор
Отправлено: 11 Августа, 2011 - 19:34:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




shkarbatov пишет:
- если файл больше 20 Мб, тогда не надо ждать пока он загрузится на сервер

Варианта 2:
0) ставите upload_max_filesize 20M и, соответственно, отваливаются все другие возможные загрузки за 20мб.
1) используете другой язык программирования. PHP всегда ждёт все данные и начинает работу строго после.

shkarbatov пишет:
показать на мою ошибку

Нарушена логика.
По логике скрипта, дословно:
если файл > 20, отправляем письмо. Затем проверяем - это загруженный файл? И в любом случае шлём ещё письмо.
А если файл < 20мб, то отправляем письмо.
Т.е. статус "файл загружен" получит файл размером в 20мб и больше, а не наоборот.


-----
PostgreSQL DBA
 
 Top
shkarbatov
Отправлено: 11 Августа, 2011 - 23:04:45
Post Id



Новичок


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


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




Письмо отправляется в любом случае, вы правы, но с разным контекстом. Если успешно, то пишет, что успешно, если не успешно, то пишет, что не успешно. С маленькими файлами работает без проблем.
 
 Top
Мелкий Супермодератор
Отправлено: 12 Августа, 2011 - 07:31:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Как же оно так работает? По коду точно видно, что сохраняется, только если он больше 20мб.
А если файл не загружен - то проверяем его тип, тоже гениально в своей бессмысленности.

PS: ох, ну и стиль. Без IDE не разберёшься.

PHP:
скопировать код в буфер обмена
  1. if(isset($_FILES["filename"]["tmp_name"]) && is_uploaded_file($_FILES["filename"]["tmp_name"])) {
  2.         if ($_FILES["filename"]["size"] < 1024*20*1024) {
  3.                 //определяем тип файл
  4.                 if (проверяем_тип_файла) {
  5.                         if (move_uploaded_file($_FILES["filename"]["tmp_name"],$target)) {
  6.                                 //файл загружен
  7.                                 } else {
  8.                                 //ошибка, файл не был сохранён
  9.                                 }
  10.                         } else {
  11.                         //неверный формат
  12.                         }
  13.                 } else {
  14.                 //файл слишком большой
  15.                 }
  16.         } else {
  17.         //файл не был загружен
  18.         }


-----
PostgreSQL DBA
 
 Top
demot
Отправлено: 12 Августа, 2011 - 09:29:05
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


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




Могу посоветовать использовать jQuery плагин Multiple File Upload
Он умеет различать и типы файлов и можно ограничить количество файлов, прост в установке и имеет маленький размер. Размер файла правда узнать с его помощью не получится
 
 Top
shkarbatov
Отправлено: 12 Августа, 2011 - 21:53:35
Post Id



Новичок


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


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




[quote=demot]Могу посоветовать использовать jQuery плагин Multiple File Upload
Он умеет различать и типы файлов и можно ограничить количество файлов, прост в установке и имеет маленький размер. Размер файла правда узнать с его помощью не получится[/quote]

Спасибо конечно, но зачем он мне тогда нужен? =)
Ведь главная задача - узнать размер файла =)

Но все равно спасибо =)
(Добавление)


[quote=Мелкий]Как же оно так работает? По коду точно видно, что сохраняется, только если он больше 20мб.
А если файл не загружен - то проверяем его тип, тоже гениально в своей бессмысленности.

PS: ох, ну и стиль. Без IDE не разберёшься.


[quote=Мелкий]Как же оно так работает? По коду точно видно, что сохраняется, только если он больше 20мб.
А если файл не загружен - то проверяем его тип, тоже гениально в своей бессмысленности.

PS: ох, ну и стиль. Без IDE не разберёшься.


Вы правы! Код написан безобразно, о чем я только думал когда его писал, вот переписал в соответствии с вашими рекомендациями:

PHP:
скопировать код в буфер обмена
  1. if(isset($_FILES["filename"]["tmp_name"]) && is_uploaded_file($_FILES["filename"]["tmp_name"]))
  2. {
  3.     if ($_FILES["filename"]["size"] < 1024*20*1024)
  4.         {
  5.                 if($type == "jpg")
  6.                 {
  7.                         if (copy($_FILES['filename']['tmp_name'], $uploadfile))
  8.                         {
  9.                                 echo "<p>Файл успешно загружен на сервер</p>";
  10.                                 $message .= "Файл успешно загружен на сервер.";
  11.                                 mail($to, $subject, $message, $headers);
  12.                         }
  13.                         else  
  14.                         {
  15.                                 echo("<p>Ошибка! Не удалось загрузить файл на сервер, попробуйте повторить попытку позже!</p>");
  16.                                 $message .= "Файл загрузить на сервер не удалось.";                                            
  17.                                 mail($to, $subject, $message, $headers);
  18.                         }
  19.                 }
  20.                 else
  21.                 {
  22.                         echo ("Файл не соответствует разрешенному формату");
  23.                         $message .= "Файл загрузить на сервер не удалось, так как он не соответствует разрешенному формату.";
  24.                         mail($to, $subject, $message, $headers);
  25.                 }
  26.     }
  27.         else
  28.         {
  29.                 echo ("Размер файла превышает 20 мегабайт");
  30.                 $message .= "Файл загрузить на сервер не удалось, так как он превышает допустимый размер - 20 МБ.";    
  31.                 mail($to, $subject, $message, $headers);
  32.         }
  33. }
  34. else
  35. {
  36.         $message .= "Файл не был выбран.";
  37.         mail($to, $subject, $message, $headers);
  38. }

(Отредактировано автором: 12 Августа, 2011 - 22:24:50)

 
 Top
demot
Отправлено: 13 Августа, 2011 - 22:40:44
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


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




Может это еще поможет отчасти
MAX_FILE_SIZE
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB