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
Форумы портала PHP.SU :: Версия для печати :: Проблема с загрузкой файла на сервер
Форумы портала PHP.SU » Клиентская разработка » JavaScript & VBScript » Проблема с загрузкой файла на сервер

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

1. shkarbatov - 11 Августа, 2011 - 19:08:34 - перейти к сообщению
Специалисты, подскажите пожалуйста в рещении проблемы.

Задача:
- необходимо загружать на сервер файлы только определенного типа;
- размер загружаемых файлов не должен превышать 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. }
2. Мелкий - 11 Августа, 2011 - 19:34:02 - перейти к сообщению
shkarbatov пишет:
- если файл больше 20 Мб, тогда не надо ждать пока он загрузится на сервер

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

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

Нарушена логика.
По логике скрипта, дословно:
если файл > 20, отправляем письмо. Затем проверяем - это загруженный файл? И в любом случае шлём ещё письмо.
А если файл < 20мб, то отправляем письмо.
Т.е. статус "файл загружен" получит файл размером в 20мб и больше, а не наоборот.
3. shkarbatov - 11 Августа, 2011 - 23:04:45 - перейти к сообщению
Письмо отправляется в любом случае, вы правы, но с разным контекстом. Если успешно, то пишет, что успешно, если не успешно, то пишет, что не успешно. С маленькими файлами работает без проблем.
4. Мелкий - 12 Августа, 2011 - 07:31:54 - перейти к сообщению
Как же оно так работает? По коду точно видно, что сохраняется, только если он больше 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.         }
5. demot - 12 Августа, 2011 - 09:29:05 - перейти к сообщению
Могу посоветовать использовать jQuery плагин Multiple File Upload
Он умеет различать и типы файлов и можно ограничить количество файлов, прост в установке и имеет маленький размер. Размер файла правда узнать с его помощью не получится
6. shkarbatov - 12 Августа, 2011 - 21:53:35 - перейти к сообщению
[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. }
7. demot - 13 Августа, 2011 - 22:40:44 - перейти к сообщению
Может это еще поможет отчасти
MAX_FILE_SIZE

 

Powered by ExBB FM 1.0 RC1