Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.08.2011, 19:15
Аспирант
Отправить личное сообщение для shkarbatov Посмотреть профиль Найти все сообщения от shkarbatov
 
Регистрация: 25.07.2011
Сообщений: 45

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

Задача:
- необходимо загружать на сервер файлы только определенного типа;
- размер загружаемых файлов не должен превышать 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);
}
Ответить с цитированием
  #2 (permalink)  
Старый 12.08.2011, 04:51
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от shkarbatov
Подскажите пожалуйста, как реализовать проверку размера файла, что-бы не ждать его полной загрузки на сервер, и объяснить, или показать на мою ошибку, почему если файл больше 20 Мб такое происходит.
Со стороны сервера этого сделать нельзя, попробуйте поместить поле
<input type="hidden" name="MAX_FILE_SIZE" value="20971520" />
в форму и тогда PHP откажется его принимать если значение MAX_FILE_SIZE будет меньше чем у загружаемого файла. Это единственный вариант предотвратить загрузку файла с большим размером на сервер. Что по поводу сервера, проверяй значение
$_FILES["filename"]["error"]
оно должно равняться нулю при успешном выполнении, в противном случае если оно имеет иное значение значит произошла ошибка... или файл не указали в форме.
Ответить с цитированием
  #3 (permalink)  
Старый 12.08.2011, 22:44
Аспирант
Отправить личное сообщение для shkarbatov Посмотреть профиль Найти все сообщения от shkarbatov
 
Регистрация: 25.07.2011
Сообщений: 45

Переписал код на нормальный =)
Переписал код на нормальный =)

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);
}
Ответить с цитированием
  #4 (permalink)  
Старый 12.08.2011, 22:48
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

if (move_uploaded_file($_FILES['filename']['tmp_name'], $uploadfile))

так будет быстрее работать чем копирование
Ответить с цитированием
  #5 (permalink)  
Старый 12.08.2011, 23:29
Аспирант
Отправить личное сообщение для shkarbatov Посмотреть профиль Найти все сообщения от shkarbatov
 
Регистрация: 25.07.2011
Сообщений: 45

Честно говоря, у меня почему-то так не работает на хостинге. Возможно чудо хостер, воз можно еще невадомая фигня, кто его знает. Пришлось писать copy.
Ответить с цитированием
  #6 (permalink)  
Старый 12.08.2011, 23:35
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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

Сообщение от shkarbatov Посмотреть сообщение
Подскажите пожалуйста, как реализовать проверку размера файла, что-бы не ждать его полной загрузки на сервер, и объяснить, или показать на мою ошибку, почему если файл больше 20 Мб такое происходит.
ждать загрузку придется. потом на пхп уже решайте, сохранять файл или нет.
Ответить с цитированием
  #7 (permalink)  
Старый 12.08.2011, 23:41
Аспирант
Отправить личное сообщение для shkarbatov Посмотреть профиль Найти все сообщения от shkarbatov
 
Регистрация: 25.07.2011
Сообщений: 45

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

Пустого письма с маленькими файлами еще не разу не приходило.
Ответить с цитированием
  #8 (permalink)  
Старый 12.08.2011, 23:43
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

хрень творится..

а эхо выводится ?

Цитата:
echo ("Размер файла превышает 20 мегабайт");
Ответить с цитированием
  #9 (permalink)  
Старый 13.08.2011, 00:27
Аспирант
Отправить личное сообщение для shkarbatov Посмотреть профиль Найти все сообщения от shkarbatov
 
Регистрация: 25.07.2011
Сообщений: 45

Нет, не выводится, отправка письма осуществляется на этапе загрузки, то есть еще до того, как он полностью загрузится. Потом просто
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с загрузкой файлов на сервер shkarbatov Серверные языки и технологии 7 27.08.2011 00:49
Кодировка внешнего JS файла - проблема в Chrome Freddis Opera, Safari и др. 3 26.07.2011 20:48
загрузка файла на сервер с помощью MSXML2.XMLHTTP asdasd AJAX и COMET 0 15.07.2011 00:30
Отправка файла на сервер асинхронно DDestroy Internet Explorer 0 09.03.2011 11:10
проблема с загрузкой avi(видео) файлов из интернета черезIE мистер смит Internet Explorer 2 20.07.2010 00:51