Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Загрузка файлов
 
 автор: kis-kis   (04.12.2008 в 12:16)   письмо автору
 
 

Подскажите, пожалуйста, в чем ошибка данного кода?

1. На допустимое расширение файлов - проверка не работает, хотя вроде должна.
2. Файл с размером больше 2 Мб все равно загружается, хотя стоит ограничение на размер.
Заранее спасибо.



<?php
if (($_POST) and ($_POST['add'] == "1"))
{
$err=0;

$validattach true;
$uploadedfile 0;
$totatt 0;
for (
$i 0$i <= 4$i++) 
{
if (
is_uploaded_file($HTTP_POST_FILES["attachment$i"]['tmp_name']))
{
$uploadedfile 1$totatt $totatt 1;
}
}
if (
$uploadedfile == 1)
{
for (
$i 0$i <= $totatt-1$i++) 
{
$source[$i] = $HTTP_POST_FILES["attachment$i"]['tmp_name'];
if (
$source[$i] !="")
{
$file_size[$i] = $HTTP_POST_FILES["attachment$i"]['size'];
$file_type[$i] = $HTTP_POST_FILES["attachment$i"]['type'];
$file_name[$i] = $HTTP_POST_FILES["attachment$i"]['name'];

if (
$file_size[$i] > 100000
{
$err=1;
$bad .= "Big size<br>";
$validattach false;
}


$excluded = array(".jpg"".gif");

while (list (
$clave$val) = each ($excluded))
{
if (
strrchr($file_name[$i], ".") != '$val')
{
echo 
"Extension not allowed - ".$file_name[$i]." - ".$val."";
$validattach false;
echo 
"2222"; exit;
}

}
}
}
}
if (
$validattach == true)
{
if (
$uploadedfile == 1)
{
for (
$i 0$i <= 4$i++) 
{
if (
$source[$i] !="")
{
$uploadpath "T:/home/rutmb.ru/www/auto/photo/files/";


$filedest $uploadpath.$file_name[$i];

// Копируем

if (move_uploaded_file$source[$i], $filedest))
{
chmod($filedest0644);
}
else

echo 
"Ошибка"
echo 
"11111"; exit;
}

}
}
}
}
}
if (
$bad
{
echo 
"<div class=\"error_add\">".$bad."</div>"
}
else
{
echo 
"Добавлено";
}

if (
$err == "1" or $_POST['add'] != "1")
{
echo 
"<form name=\"auto_add_form\" method=\"post\" action=\"\" enctype=\"multipart/form-data\">
<input type=\"file\" size=\"40\" name=\"attachment0\" onchange=\"addInput()\">
<input type=\"submit\" name=\"Submit\" id=\"submit\" value=\"Добавить\">
<input type=\"hidden\" name=\"add\" value=\"1\"></form>"
;
}
?>

  Ответить  
 
 автор: elenaki   (04.12.2008 в 12:29)   письмо автору
 
   для: kis-kis   (04.12.2008 в 12:16)
 

$HTTP_POST_FILES давно пора заменить на $_FILES

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 12:36)   письмо автору
 
   для: elenaki   (04.12.2008 в 12:29)
 

Исправил, но разве это влияет на работу?

  Ответить  
 
 автор: elenaki   (04.12.2008 в 12:29)   письмо автору
 
   для: kis-kis   (04.12.2008 в 12:16)
 

ВМЕСТО ЭТОГО
$HTTP_POST_FILES["attachment$i"]['tmp_name']))
ЭТО
$_FILES["attachment"]['tmp_name'][$i];

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 12:53)   письмо автору
 
   для: elenaki   (04.12.2008 в 12:29)
 

Только тогда так - $_FILES["attachment$i"]['tmp_name'];

  Ответить  
 
 автор: elenaki   (04.12.2008 в 13:08)   письмо автору
 
   для: kis-kis   (04.12.2008 в 12:53)
 

не понимаю этой конструкции. вы массив передаете? несколько файлов? если вывести это на печать, что выводится?

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 13:15)   письмо автору
 
   для: elenaki   (04.12.2008 в 13:08)
 

Да, массив.

  Ответить  
 
 автор: sim5   (04.12.2008 в 13:24)   письмо автору
 
   для: kis-kis   (04.12.2008 в 13:15)
 

Вы в этом уверены?

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 13:40)   письмо автору
 
   для: sim5   (04.12.2008 в 13:24)
 

Уверен. В коде js-скрипта нет просто.

  Ответить  
 
 автор: sim5   (04.12.2008 в 13:45)   письмо автору
 
   для: kis-kis   (04.12.2008 в 13:40)
 

Если бы это был массив, то ваши поля бы именовали как attachment[], а не attachment0, attachment1, attachment3... и т.д., и обращения к ним при разложении массива, должно быть как
$_FELES['attachment']['tmp_name'][итерация цикла], а не $_FELES['attachmen$i']['tmp_name'] как это у вас имеет место быть.

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 13:55)   письмо автору
 
   для: sim5   (04.12.2008 в 13:45)
 


var f = 0;
function addInput () {
if (f < 4 ) {
  if (document.all || document.getElementById) {
    var table = document.all ? document.all.formElems :
      document.getElementById('formElems');
    var row = table.insertRow(++f);
    if (document.all) {
      var cell = row.insertCell(0);
      cell.innerHTML =
        '<INPUT TYPE="file" NAME="attachment' + f + '"'
        + ' ONCHANGE="addInput()">';
    }
    else {
      cell = row.insertCell(0);
      input = document.createElement('INPUT');
      input.setAttribute('type', 'file');
      input.name = 'attachment' + f;
      input.onchange = function () { addInput(); };
      cell.appendChild(input);
    }
  }
}
}

  Ответить  
 
 автор: sim5   (04.12.2008 в 14:10)   письмо автору
 
   для: kis-kis   (04.12.2008 в 13:55)
 

И что?

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 14:22)   письмо автору
 
   для: sim5   (04.12.2008 в 14:10)
 

Не могли бы вы быть так любезны объяснить, в моем конкретном случае, в чем ошибка?

  Ответить  
 
 автор: sim5   (04.12.2008 в 14:52)   письмо автору
 
   для: kis-kis   (04.12.2008 в 14:22)
 

Нет тут ошибки, просто вы не массив получаете, но думаете что это так. У вас 4 отдельных файла приходит никак не связанные между собой, только частью имени.

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 14:55)   письмо автору
 
   для: sim5   (04.12.2008 в 14:52)
 

Тогда почему проверка на тип файлов не работает? А также почему загружаются файлы больше допустимого размера? Спасибо.

  Ответить  
 
 автор: sim5   (04.12.2008 в 15:14)   письмо автору
38 байт
 
   для: kis-kis   (04.12.2008 в 14:55)
 

Вот здесь ответы практически на все ваши вопросы. Если файл загружен в темп каталог, проверяя ошибки при загрузке, и убедившись что их нет, вы без проблем проведете проверку. Что касается проверки типа, то так как вы ее делаете, это халтура. Вот вам загадка - что я прикрепил для вас?

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 15:45)   письмо автору
 
   для: sim5   (04.12.2008 в 15:14)
 

Скорее всего текстовый файл содержащий данный текст "Написать сообщение" :)

  Ответить  
 
 автор: sim5   (04.12.2008 в 15:54)   письмо автору
 
   для: kis-kis   (04.12.2008 в 15:45)
 

Вот именно, но тем неменее он имеет расширение jpg. Спрашивается, стоит ли доверять рсширению? Уж лучше проверять по массиву типов, либо используя функцию getimagesize().

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 19:17)   письмо автору
 
   для: sim5   (04.12.2008 в 15:54)
 

Сделал так, однако zip и pdf (только их пробовал) все равно пропускает =(


$allowed = array('image/gif','image/jpeg','image/png');

if ((is_array($allowed)) && (!empty($allowed)))
if (!in_array($file_type[$i], $allowed))
{
$err=1;
$bad .= "неверный тип<br>";
$validattach = false;

  Ответить  
 
 автор: sim5   (04.12.2008 в 19:24)   письмо автору
 
   для: kis-kis   (04.12.2008 в 19:17)
 

Стоп! Что значит $file_type? Чему это равно? И почему [$i]?

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 19:28)   письмо автору
 
   для: sim5   (04.12.2008 в 19:24)
 


$file_type[$i] = $_FILES["attachment$i"]['type']; 


[$i] - от 0 до 4 файлов

  Ответить  
 
 автор: sim5   (04.12.2008 в 19:42)   письмо автору
 
   для: kis-kis   (04.12.2008 в 19:28)
 

Понятно. У вас ошибка в массиве объявляемых типов (для JPG). Проверяйте, кроме указанных не пропустит:
<?
if ($_FILES['as']['tmp_name']) {
  
$type = array('image/png','image/pjpeg','image/gif');
  echo 
in_array($_FILES['as']['type'], $type) ? "Yes" "No";
}
?>  
<form action="" method="post" enctype="multipart/form-data"> 
<input type="file" name="as"><br>  
<input type="submit"  value="Send">    
</form>

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 19:48)   письмо автору
 
   для: sim5   (04.12.2008 в 19:42)
 

Если image/pjpeg - то *.jpg вообще не пускает...

И еще вопрос - почему у некоторых файлов тип не определяется?

  Ответить  
 
 автор: sim5   (04.12.2008 в 19:53)   письмо автору
 
   для: kis-kis   (04.12.2008 в 19:48)
 

А вы добавьте в эту часть еще строки:
<?
if ($_FILES['as']['tmp_name']) { 
  
$type = array('image/png','image/pjpeg','image/gif'); 
  echo 
in_array($_FILES['as']['type'], $type) ? "Yes<pre>" "No<pre>";
  
print_r($_FILES);
  echo 
"</pre>";
}
?>

Что наблюдаем теперь? И посмотрите тип для jpg в массиве $_FILES.

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 19:58)   письмо автору
 
   для: sim5   (04.12.2008 в 19:53)
 

NoArray ( [as] => Array ( [name] => 3d_551.jpg [type] => image/jpeg [tmp_name] => T:\tmp\php1C11.tmp [error] => 0 [size] => 49731 ) )

А вот пример, где тип и размер не определяется почему-то - Array ( [as] => Array ( [name] => 0_f079_4c984cc3_orig.jpg [type] => [tmp_name] => [error] => 1 [size] => 0 ) )

  Ответить  
 
 автор: sim5   (04.12.2008 в 20:05)   письмо автору
 
   для: kis-kis   (04.12.2008 в 19:58)
 

Я вам сказал уже - смените в массиве image/jpeg на image/pjpeg, и в первом случае тип будет верно опознан. Во втором случае не распознается тип файла, такое возможно. Проверьте его посредством getimagesize($_FILES[as][tmp_name]). Если не опознает, то у этого файла некорректный заголовок. Вы его в браузере видите (если поместить на страницу)?

PS. Прадон, что я говорю. Отдельно это проверяйте указывая реальный пкть к файлу getimagesize(путь/имя). То есть без формы и отправки, а отдельным скриптом. Файл то на сервер загружен не будет.

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 20:14)   письмо автору
 
   для: sim5   (04.12.2008 в 20:05)
 

>>Проверьте его посредством getimagesize($_FILES[as][tmp_name]).
Ничего нет.

>>Вы его в браузере видите (если поместить на страницу)?

Отлично вижу :)

  Ответить  
 
 автор: sim5   (04.12.2008 в 20:17)   письмо автору
 
   для: kis-kis   (04.12.2008 в 20:14)
 

Размер файла большой, превышает установленный сервером. Код ошибки 1. Все, я уже устал, пора отдыхать.

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 20:22)   письмо автору
 
   для: sim5   (04.12.2008 в 20:17)
 

Спасибо Вам! :)

Зато теперь я наконец-то разобрался...

  Ответить  
 
 автор: kis-kis   (05.12.2008 в 11:44)   письмо автору
 
   для: sim5   (04.12.2008 в 20:17)
 

В Денвере, где можно посмотреть размер файла, установленный сервером?

  Ответить  
 
 автор: sim5   (05.12.2008 в 11:50)   письмо автору
 
   для: kis-kis   (05.12.2008 в 11:44)
 

\usr\local\php5\php.ini
; Maximum size of POST data that PHP will accept.
post_max_size =
; Maximum allowed size for uploaded files.
upload_max_filesize =

  Ответить  
 
 автор: kis-kis   (05.12.2008 в 12:02)   письмо автору
 
   для: sim5   (05.12.2008 в 11:50)
 

Спасибо.

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 12:58)   письмо автору
 
   для: elenaki   (04.12.2008 в 12:29)
 

А проверка на допустимый тип файлов все равно не работает :(

  Ответить  
 
 автор: sim5   (04.12.2008 в 13:46)   письмо автору
 
   для: kis-kis   (04.12.2008 в 12:58)
 

А проверка типа файла по расширению, это халтура.

  Ответить  
 
 автор: kis-kis   (04.12.2008 в 14:04)   письмо автору
 
   для: sim5   (04.12.2008 в 13:46)
 

Как Вы посоветуете?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования