Проблема с загрузкой файла на сервер
Специалисты, подскажите пожалуйста в рещении проблемы.
Задача: - необходимо загружать на сервер файлы только определенного типа; - размер загружаемых файлов не должен превышать 20 Мб; - если файл меньше 20 Мб и соответствует разрешенному типу формируется письмо с текстом и отправляется на почту - если файл больше 20 Мб или не соответствует разрешенному типу формируется письмо с текстом об ошибке и отправляется на почту - если файл больше 20 Мб, тогда не надо ждать пока он загрузится на сервер (этого пока нет, пробывал с полем hidden, но что-то не получается) В принципе все реализовано, вот только есть одно НО! Если файл больше 20 Мб, тогда сервер ждет его полной загрузки, и при формировании письма, он отправляет на почту абсолютно пустое письмо без текста и темы. Подскажите пожалуйста, как реализовать проверку размера файла, что-бы не ждать его полной загрузки на сервер, и объяснить, или показать на мою ошибку, почему если файл больше 20 Мб такое происходит. upload_max_filesize => 32M => 32M Текст письма содержится в переменной $message. Заранее благодарен! -------------------------------------------------------- Есть html-форма: <form id="form1" action="send_email.php" method="post" enctype="multipart/form-data"> <input type="file" name="filename"> <input type="button" value="Загрузить" onClick="tr();"> </form> -------------------------------------------------------- Серверная часть: // Проверка файла на размер if($_FILES["filename"]["size"] > 1024*20*1024) { echo ("Размер файла превышает 20 мегабайт"); $message .= "\r\n\r\n\r\nФайл загрузить на сервер не удалось, так как он превышает допустимый размер - 20 МБ."; mail($to, $subject, $message, $headers); echo "<meta http-equiv='refresh'; content='5; url=/index.php?option=com_content&view=article&id=198&Itemid=232'>"; // Проверяем загружен ли файл if(is_uploaded_file($_FILES["filename"]["tmp_name"])) { // Если файл загружен успешно, перемещаем его из временной директории в конечную if (copy($_FILES['filename']['tmp_name'], $uploadfile)) { echo "<p>Файл успешно загружен на сервер</p>"; $message .= "\r\n\r\n\r\nФайл успешно загружен на сервер."; mail($to, $subject, $message, $headers); echo "<meta http-equiv='refresh'; content='5; url=/index.php'> "; } else { echo("<p>Ошибка! Не удалось загрузить файл на сервер, попробуйте повторить попытку позже!</p>"); $message .= "\r\n\r\n\r\nФайл загрузить на сервер не удалось."; mail($to, $subject, $message, $headers); echo "<meta http-equiv='refresh'; content='5; url=/index.php?option=com_content&view=article&id=198&Itemid=232'>"; } } // Проверка на несоответсвие типа elseif ($type !== "jpg") { echo ("Файл не соответствует разрешенному формату"); $message .= "\r\n\r\n\r\nФайл загрузить на сервер не удалось, так как он не соответствует разрешенному формату."; mail($to, $subject, $message, $headers); echo "<meta http-equiv='refresh'; content='5; url=/index.php?option=com_content&view=article&id=198&Itemid=232'> "; } } else { $asd = mail($to, $subject, $message, $headers); } |
Цитата:
<input type="hidden" name="MAX_FILE_SIZE" value="20971520" />в форму и тогда PHP откажется его принимать если значение MAX_FILE_SIZE будет меньше чем у загружаемого файла. Это единственный вариант предотвратить загрузку файла с большим размером на сервер. Что по поводу сервера, проверяй значение $_FILES["filename"]["error"]оно должно равняться нулю при успешном выполнении, в противном случае если оно имеет иное значение значит произошла ошибка... или файл не указали в форме. |
Переписал код на нормальный =)
Переписал код на нормальный =)
if(isset($_FILES["filename"]["tmp_name"]) && is_uploaded_file($_FILES["filename"]["tmp_name"])) { if ($_FILES["filename"]["size"] < 1024*20*1024) { if($type == "jpg") { if (copy($_FILES['filename']['tmp_name'], $uploadfile)) { echo "<p>Файл успешно загружен на сервер</p>"; $message .= "Файл успешно загружен на сервер."; mail($to, $subject, $message, $headers); } else { echo("<p>Ошибка! Не удалось загрузить файл на сервер, попробуйте повторить попытку позже!</p>"); $message .= "Файл загрузить на сервер не удалось."; mail($to, $subject, $message, $headers); } } else { echo ("Файл не соответствует разрешенному формату"); $message .= "Файл загрузить на сервер не удалось, так как он не соответствует разрешенному формату."; mail($to, $subject, $message, $headers); } } else { echo ("Размер файла превышает 20 мегабайт"); $message .= "Файл загрузить на сервер не удалось, так как он превышает допустимый размер - 20 МБ."; mail($to, $subject, $message, $headers); } } else { $message .= "Файл не был выбран."; mail($to, $subject, $message, $headers); } |
if (move_uploaded_file($_FILES['filename']['tmp_name'], $uploadfile)) так будет быстрее работать чем копирование |
Честно говоря, у меня почему-то так не работает на хостинге. Возможно чудо хостер, воз можно еще невадомая фигня, кто его знает. Пришлось писать copy.
|
Цитата:
Цитата:
|
Если файлы используются менее 20 Мб, тогда отправка на сервер идет нормально, письма формируются и отправляются на почту.
Пустого письма с маленькими файлами еще не разу не приходило. |
хрень творится..
а эхо выводится ? Цитата:
|
Нет, не выводится, отправка письма осуществляется на этапе загрузки, то есть еще до того, как он полностью загрузится. Потом просто
|
Часовой пояс GMT +3, время: 16:48. |