|
|
|
| Подскажите, пожалуйста, в чем ошибка данного кода?
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($filedest, 0644);
}
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>";
}
?>
|
| |
|
|
|
|
|
|
|
для: kis-kis
(04.12.2008 в 12:16)
| | $HTTP_POST_FILES давно пора заменить на $_FILES | |
|
|
|
|
|
|
|
для: 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]; | |
|
|
|
|
|
|
|
для: elenaki
(04.12.2008 в 12:29)
| | Только тогда так - $_FILES["attachment$i"]['tmp_name']; | |
|
|
|
|
|
|
|
для: kis-kis
(04.12.2008 в 12:53)
| | не понимаю этой конструкции. вы массив передаете? несколько файлов? если вывести это на печать, что выводится? | |
|
|
|
|
|
|
|
для: elenaki
(04.12.2008 в 13:08)
| | Да, массив. | |
|
|
|
|
|
|
|
для: kis-kis
(04.12.2008 в 13:15)
| | Вы в этом уверены? | |
|
|
|
|
|
|
|
для: sim5
(04.12.2008 в 13:24)
| | Уверен. В коде js-скрипта нет просто. | |
|
|
|
|
|
|
|
для: kis-kis
(04.12.2008 в 13:40)
| | Если бы это был массив, то ваши поля бы именовали как attachment[], а не attachment0, attachment1, attachment3... и т.д., и обращения к ним при разложении массива, должно быть как
$_FELES['attachment']['tmp_name'][итерация цикла], а не $_FELES['attachmen$i']['tmp_name'] как это у вас имеет место быть. | |
|
|
|
|
|
|
|
для: 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);
}
}
}
}
|
| |
|
|
|
|
|
|
|
для: kis-kis
(04.12.2008 в 13:55)
| | И что? | |
|
|
|
|
|
|
|
для: sim5
(04.12.2008 в 14:10)
| | Не могли бы вы быть так любезны объяснить, в моем конкретном случае, в чем ошибка? | |
|
|
|
|
|
|
|
для: kis-kis
(04.12.2008 в 14:22)
| | Нет тут ошибки, просто вы не массив получаете, но думаете что это так. У вас 4 отдельных файла приходит никак не связанные между собой, только частью имени. | |
|
|
|
|
|
|
|
для: sim5
(04.12.2008 в 14:52)
| | Тогда почему проверка на тип файлов не работает? А также почему загружаются файлы больше допустимого размера? Спасибо. | |
|
|
|
|
 38 байт |
|
|
для: kis-kis
(04.12.2008 в 14:55)
| | Вот здесь ответы практически на все ваши вопросы. Если файл загружен в темп каталог, проверяя ошибки при загрузке, и убедившись что их нет, вы без проблем проведете проверку. Что касается проверки типа, то так как вы ее делаете, это халтура. Вот вам загадка - что я прикрепил для вас? | |
|
|
|
|
|
|
|
для: sim5
(04.12.2008 в 15:14)
| | Скорее всего текстовый файл содержащий данный текст "Написать сообщение" :) | |
|
|
|
|
|
|
|
для: kis-kis
(04.12.2008 в 15:45)
| | Вот именно, но тем неменее он имеет расширение jpg. Спрашивается, стоит ли доверять рсширению? Уж лучше проверять по массиву типов, либо используя функцию getimagesize(). | |
|
|
|
|
|
|
|
для: 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;
}
|
| |
|
|
|
|
|
|
|
для: kis-kis
(04.12.2008 в 19:17)
| | Стоп! Что значит $file_type? Чему это равно? И почему [$i]? | |
|
|
|
|
|
|
|
для: sim5
(04.12.2008 в 19:24)
| |
$file_type[$i] = $_FILES["attachment$i"]['type'];
|
[$i] - от 0 до 4 файлов | |
|
|
|
|
|
|
|
для: 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>
|
| |
|
|
|
|
|
|
|
для: sim5
(04.12.2008 в 19:42)
| | Если image/pjpeg - то *.jpg вообще не пускает...
И еще вопрос - почему у некоторых файлов тип не определяется? | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: 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 ) ) | |
|
|
|
|
|
|
|
для: kis-kis
(04.12.2008 в 19:58)
| | Я вам сказал уже - смените в массиве image/jpeg на image/pjpeg, и в первом случае тип будет верно опознан. Во втором случае не распознается тип файла, такое возможно. Проверьте его посредством getimagesize($_FILES[as][tmp_name]). Если не опознает, то у этого файла некорректный заголовок. Вы его в браузере видите (если поместить на страницу)?
PS. Прадон, что я говорю. Отдельно это проверяйте указывая реальный пкть к файлу getimagesize(путь/имя). То есть без формы и отправки, а отдельным скриптом. Файл то на сервер загружен не будет. | |
|
|
|
|
|
|
|
для: sim5
(04.12.2008 в 20:05)
| | >>Проверьте его посредством getimagesize($_FILES[as][tmp_name]).
Ничего нет.
>>Вы его в браузере видите (если поместить на страницу)?
Отлично вижу :) | |
|
|
|
|
|
|
|
для: kis-kis
(04.12.2008 в 20:14)
| | Размер файла большой, превышает установленный сервером. Код ошибки 1. Все, я уже устал, пора отдыхать. | |
|
|
|
|
|
|
|
для: sim5
(04.12.2008 в 20:17)
| | Спасибо Вам! :)
Зато теперь я наконец-то разобрался... | |
|
|
|
|
|
|
|
для: sim5
(04.12.2008 в 20:17)
| | В Денвере, где можно посмотреть размер файла, установленный сервером? | |
|
|
|
|
|
|
|
для: 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 = | |
|
|
|
|
|
|
|
для: sim5
(05.12.2008 в 11:50)
| | Спасибо. | |
|
|
|
|
|
|
|
для: elenaki
(04.12.2008 в 12:29)
| | А проверка на допустимый тип файлов все равно не работает :( | |
|
|
|
|
|
|
|
для: kis-kis
(04.12.2008 в 12:58)
| | А проверка типа файла по расширению, это халтура. | |
|
|
|
|
|
|
|
для: sim5
(04.12.2008 в 13:46)
| | Как Вы посоветуете? | |
|
|
|