|
|
|
| делаю через форму загрузку нескольких файлов на сервер одновременно, данные есть, но почему-то из временной папки в нужную директорию переносит только один файл, вот код:
$name = array();
$image = array();
$smallimage = array();
for ($i=0; $i<count($_FILES['photo']['name']); $i++)
{
echo $i." - ".$_FILES['photo']['name'][$i]."<br />";
// Определяем расширение файла
$ext = strrchr($_FILES['photo']['name'][$i], ".");
// Формируем путь к файлу
$name[$i] = date("YmdHis",time()).$ext;
$image[$i] = "../../media/original/".$name[$i];
$smallimage[$i] = "../../media/thumb/".$name[$i];
// Перемещаем файл из временной директории сервера в
// директорию /files Web-приложения
if (copy($_FILES['photo']['tmp_name'][$i],$image[$i]))
{
// Уничтожаем файл во временной директории
unlink($_FILES['photo']['tmp_name'][$i]);
// Изменяем права доступа к файлу
chmod($image[$i], 0644);
}
}
|
| |
|
|
|
|
|
|
|
для: Bvz
(07.10.2010 в 14:49)
| | Лично вы на форуме задавали, и не раз, вопросы касающиеся загрузки изображения, и вам не раз отвечали на них. И тем не менее, как об стенку горохом - вы продолжаете грузить файлы на сервер методом давно не рекомендуемым, определяя тип файла методом ненадежным.
Зачем вам тогда все рассказывать? | |
|
|
|
|
|
|
|
для: sim5
(07.10.2010 в 15:48)
| | согласен с вами, но вопрос не с проверкой расширений а с множественной загрузкой, дайте шанс! | |
|
|
|
|
|
|
|
для: Bvz
(07.10.2010 в 15:53)
| | Так я вам уже сказал, что вы даже один файл закачиваете методом нерекомендуемым! Да и давал я вам давно ссылку на примеры скачивания множества файлов на сервер - это из официального руководства РНР, и пусть вы может и не знаете английского, но в коде, а он простой, разобраться не составит труда. Ознакомтесь. | |
|
|
|
|
|
|
|
для: sim5
(07.10.2010 в 15:56)
| | вы имеете ввиду этот пример?
<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "Possible file upload attack!\n";
}
echo 'Here is some more debugging info:';
print_r($_FILES);
print "</pre>";
?>
|
http://www.php.net/manual/en/features.file-upload.post-method.php | |
|
|
|
|
|
|
|
для: Bvz
(07.10.2010 в 16:25)
| | Уже прогресс, хотя это загрузка одного файла, но заметьте, какая функция используется при перемещении файла из временной папки. Функция copy() не годится для этого по некоторым соображениям, о которых вы таже можете прочесть в руководстве.
А тут http://ru.php.net/manual/en/features.file-upload.multiple.php описывается загрузка нескольких файлов, и даны примеры. | |
|
|
|
|
|
|
|
для: sim5
(07.10.2010 в 16:30)
| | да спасибо, буду разбираться:
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "Possible file upload attack!\n";
}
echo 'Here is some more debugging info:';
print_r($_FILES);
print "</pre>";
|
| |
|
|
|
|
|
|
|
для: Bvz
(07.10.2010 в 17:31)
| | Спасибо за подзатыльник, впреть со мной только так, вот пока набросал такой скрипт:
<?php
$uploaddir = '../../media/original/';
for ($i=0; $i<count($_FILES['photo']['name']); $i++)
{
$uploadfile = $uploaddir . basename($_FILES['photo']['name'][$i]);
if (move_uploaded_file($_FILES['photo']['tmp_name'][$i], $uploadfile)) {
echo "Файл успешно загружен.\n";
} else {
echo "Возможная атака при загрузке!\n";
}
}
?>
|
Теперь можно добавить проверку на пустые поля и удаление их из массива и переименование файлов, пнете куда нужно? И как тут проверять расширение? Какие тут могут быть атаки, чтоб защититься от них? | |
|
|
|
|
|
|
|
для: Bvz
(07.10.2010 в 18:01)
| | Вы начните с того, что прежде чем начинать загрузку (вернее перемещение загруженного) файла, проверьте отсутствие ошибки. Ведь $_FILES['photo']['name'] имеет место быть и тогда, когда файл загрузится не полностью. И только если ошибка отсутствует, начинайте проверку файла на соответствие его вашим условиям. Если все соответствует, тогда только начинайте перемещение.
basename для $_FILES['photo']['name'] функция совсем лишняя, ибо данный элемент массива содержит только имя файла, а путь его на клиенте на сервер не передается.
Для изображений уже существует функция, которая обеспечит более надежную проверку типа загружаемого изображения - getimagesize(), а можно еще с помощью функций GD проверить на "мусорность" файл загружаемый. Для остальных типов файлов - это проверка их по заголовку.
Атака с помощью изображения без "помощника" практически не имеет перспективы, а вот забросить мусора на сервер можно предостаточно, если вы будете доверять трем волшебным буковкам после точки, и передаваемым заголовкам, которые тоже можно подделать.
Проверить пустые поля пришедшего массива можно функциями работы с массивами - загляните в их описание, и постарайтесь сами найти среди них таковые.
PS. И учтите, загружать изображения в папку под оригинальным именем можно, если только вы уверены, что другое изображение не будет иметь точно такое же имя. | |
|
|
|
|
|
|
|
для: sim5
(07.10.2010 в 18:19)
| | спасибо за подсказки, вот получилось без проверки на пустое поле массива и получение уникального имени и детального разбора ошибок:
<?php
$uploaddir = '../../media/original/';
for ($i=0; $i<count($_FILES['photo']['name']); $i++)
{
if ($_FILES['photo']['error'][$i] == 0)
{
$uploadfile = $uploaddir . $_FILES['photo']['name'][$i];
$type = getimagesize($_FILES['photo']['tmp_name'][$i]);
if ($type[2] == 1 || $type[2] == 2 || $type[2] == 3 )
{
if (move_uploaded_file($_FILES['photo']['tmp_name'][$i], $uploadfile))
{
echo "Файл успешно загружен.<br />";
}
else
{
echo "<span class=\"error\">1Файл не был загружен на сервер.</span><br />";
}
}
else
{
echo "<span class=\"error\">2Файл не является изображением.</span><br />";
}
}
else
{
echo "<span class=\"error\">3Файл не был загружен на сервер.</span><br />";
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Bvz
(07.10.2010 в 22:12)
| | Вы уже и "красоту" навели, рано.
if ($type[2] == 1 || $type[2] == 2 || $type[2] == 3 ) - это ведь и сократить можно.
Пустые поля проверять не стоит, их нужно просто вырезать из массива. | |
|
|
|
|
|
|
|
для: sim5
(08.10.2010 в 05:37)
| | >Вы уже и "красоту" навели, рано.
>if ($type[2] == 1 || $type[2] == 2 || $type[2] == 3 ) - это ведь и сократить можно.
как даже не представляю?
>Пустые поля проверять не стоит, их нужно просто вырезать из массива.
т.е. до обработки в цикле for ($i=0; $i<count($_FILES['photo']['name']); $i++), правильно я понял? | |
|
|
|
|
|
|
|
для: Bvz
(08.10.2010 в 05:42)
| | Прочтите еще внимательно о функции, что она возвращает, и что вам по условию нужно, станет понятным как сократить запись.
Конечно до цикла, зачем гонять в нем поля пустые, тем более если их с десяток. | |
|
|
|
|
|
|
|
для: sim5
(08.10.2010 в 05:50)
| | - Спасибо еще раз за хороший пинок, код получается более функциональный!
>Вы начните с того, что прежде чем начинать загрузку (вернее перемещение загруженного) файла, >проверьте отсутствие ошибки. Ведь $_FILES['photo']['name'] имеет место быть и тогда, когда файл >загрузится не полностью.
- а здесь нужна детализация ошибки или достаточно понимания ее наличия или нет?
>И только если ошибка отсутствует, начинайте проверку файла на соответствие его вашим >условиям. Если все соответствует, тогда только начинайте перемещение.
>Для изображений уже существует функция, которая обеспечит более надежную проверку типа >загружаемого изображения - getimagesize(), а можно еще с помощью функций GD проверить на >"мусорность" файл загружаемый. Для остальных типов файлов - это проверка их по заголовку.
>Атака с помощью изображения без "помощника" практически не имеет перспективы, а вот >забросить мусора на сервер можно предостаточно, если вы будете доверять трем волшебным >буковкам после точки, и передаваемым заголовкам, которые тоже можно подделать.
>Прочтите еще внимательно о функции, что она возвращает, и что вам по условию нужно, станет >понятным как сократить запись.
- ничего не пришло в голову, кроме как проверить вместо if ($type[2] == 1 || $type[2] == 2 || $type[2] == 3) сделать if (!empty($type))
>Проверить пустые поля пришедшего массива можно функциями работы с массивами - загляните в >их описание, и постарайтесь сами найти среди них таковые.
- тоже не придумал, как проверить на пустоту $_FILES['photo']['tmp_name'][$i], если пустая то выходить из цикла, т.е после:
if ($_FILES['photo']['error'][$i] == 0)
сделать проверку:
if (!empty($_FILES['photo']['tmp_name'][$i]))
{
...производить манипуляции с перемещением и переименованием файла, а так же проверкой на то, что файл является изображением
}
а как раньше их вырезать ума не приложу, скорее недо будет писать функцию, стандартной не нашел
>PS. И учтите, загружать изображения в папку под оригинальным именем можно, если только вы >уверены, что другое изображение не будет иметь точно такое же имя.
- здесь буду присваивать уникальное имя файлу | |
|
|
|
|
|
|
|
для: Bvz
(08.10.2010 в 10:36)
| |
Если доступ к файлу filename изображения невозможен или если это неправильное изображение, getimagesize() возвратит NULL и сгенерирует предупреждение.
|
| |
|
|
|
|
|
|
|
для: Bvz
(08.10.2010 в 10:36)
| | Если хотите что-то процитировать, то цитируйте основное, а не 100%-ное содержимое, иначе в какофонии этого и не понять, что где.
Первое, что нужно сказать, это «красивость», которую вы поспешили навести. Если вы будете обрабатывать загрузку одного файла, то код:
echo "Файл успешно загружен.<br />";
echo "<span class=\"error\">1Файл не был загружен на сервер.</span><br />";
echo "<span class=\"error\">2Файл не является изображением.</span><br />";
echo "<span class=\"error\">3Файл не был загружен на сервер.</span><br />";
имеет право на существование, но с поправкой – «1Файл» пишется раздельно. А что увидит в этом случае пользователь, если производится загрузка нескольких файлов? Пользователь не нумерует файлы, не выставляет индексы полям формы и не держит в уме их соответствие выбранным файлам. И не обязательно, что файлы будут чинно и по порядку загружены, то есть, начиная с первого поля в форме и далее. Простая оплошность может быть причиной того, что файлы будут загружены полями, например 1 и 3, а остальные поля пусты. Вы думаете, пользователь поймет, к чему относятся ваши грозные сообщения или сообщения об успешной загрузке? Почему вы не ставите себя на место пользователя, когда что-то пишите?
Если вам требуется знать, что код ошибки не содержит ее, для того чтобы принять решение о перемещении файла, то какая может быть ее детализация при ее отсутствии? Если есть ошибка, тогда и детализируйте, дабы знать причину неудачи и сообщить ее либо пользователю, либо администратору. Но проверка отсутствия ошибки, это достаточно:
if (!$_FILES['photo']['error'][$i]) вместо if ($_FILES['photo']['error'][$i] == 0).
getimagesize() возвращает false, если загружаемый файл не графический, иначе третьим элементом возвращаемого массива будет число определяющее тип загружаемого изображения. Вопрос – зная вышесказанное, и то, что вам нужны только типы с 1 по 3, как прописать такое условие, и не перечисляя каждый из типов?
Удалять пустые значения массива перед их проверкой выгодно тогда, когда массив большой и проверка многогранная, иначе выгоды нет, и достаточно проверять условием в цикле пустое поле, так как вы и пытаетесь:
if (!empty($_FILES['photo']['tmp_name'][$i])) | |
|
|
|
|
|
|
|
для: sim5
(08.10.2010 в 12:56)
| | >Если хотите что-то процитировать, то цитируйте основное, а не 100%-ное содержимое, иначе в какофонии этого и не понять, что где.
учту
>Первое, что нужно сказать, это «красивость», которую вы поспешили навести. Если вы будете обрабатывать загрузку одного файла, то код:
учту
>имеет право на существование, но с поправкой – «1Файл» пишется раздельно. А что увидит в этом случае пользователь, если производится загрузка нескольких файлов? Пользователь не нумерует файлы, не выставляет индексы полям формы и не держит в уме их соответствие выбранным файлам. И не обязательно, что файлы будут чинно и по порядку загружены, то есть, начиная с первого поля в форме и далее. Простая оплошность может быть причиной того, что файлы будут загружены полями, например 1 и 3, а остальные поля пусты. Вы думаете, пользователь поймет, к чему относятся ваши грозные сообщения или сообщения об успешной загрузке? Почему вы не ставите себя на место пользователя, когда что-то пишите?
это я для себя цифры поставил, чтоб понять в каком месте ошибка, забыл убрать )) а так я учел все, что вы указали, спасибо!
>if (!$_FILES['photo']['error'][$i]) вместо if ($_FILES['photo']['error'][$i] == 0).
спасибо
>getimagesize() возвращает false, если загружаемый файл не графический, иначе третьим элементом возвращаемого массива будет число определяющее тип загружаемого изображения. Вопрос – зная вышесказанное, и то, что вам нужны только типы с 1 по 3, как прописать такое условие, и не перечисляя каждый из типов?
так? if ($type[2] >= 1 || $type[2] <= 3)
>Удалять пустые значения массива перед их проверкой выгодно тогда, когда массив большой и проверка многогранная, иначе выгоды нет, и достаточно проверять условием в цикле пустое поле, так как вы и пытаетесь:
ну да, а подскажите, как удалить, когда поле пустое?
вот получилось пока так:
<?php
$uploaddiroriginal = '../../media/original/';
$uploaddirthumb = '../../media/thumb/';
for ($i=0; $i<count($_FILES['photo']['name']); $i++)
{
if (!$_FILES['photo']['error'][$i])
{
if ($_FILES['photo']['tmp_name'][$i])
{
$uploadfile = $uploaddiroriginal . $_FILES['photo']['name'][$i];
$type = getimagesize($_FILES['photo']['tmp_name'][$i]);
if ($type[2] >= 1 || $type[2] <= 3)
{
if (move_uploaded_file($_FILES['photo']['tmp_name'][$i], $uploadfile))
{
echo "Файл успешно загружен.<br />";
}
else
{
echo "<span class=\"error\">Файл не был загружен на сервер.</span><br />";
}
}
else
{
echo "<span class=\"error\">Файл не является изображением.</span><br />";
}
}
else
{
echo "<span class=\"error\">Файл не был загружен на сервер.</span><br />";
}
}
else
{
echo "<span class=\"error\">Файл не был загружен на сервер.</span><br />";
}
}
?>
|
осталось добавить переименование файла в уникальное значение | |
|
|
|
|
|
|
|
для: Bvz
(08.10.2010 в 15:18)
| | Оригинально вы учитываете, если тут же опять цитируете все подряд. Зачем? Я что не помню слов своих?
Пока у вас ничего не получается, ибо надо не учитывать, а делать сразу, все, это одна большая задача. Не клейте к ней "заплатки", а пишите логическую конструкцию.
Как было непонятно для пользователя, так и останется непонятным. Файлы не переименовывают, а просто дают им уникальные имена, а оригинальное имя, иногда может и пригодиться.
if($type && $type[2] < 4)......
И разбирайтесь с многократными else... echo... написав так, чтобы пользователь понимал к какому изображению ваше echo относится. | |
|
|
|
|
|
|
|
для: sim5
(08.10.2010 в 15:44)
| | >Не клейте к ней "заплатки", а пишите логическую конструкцию.
беру на вооружение
>Как было непонятно для пользователя, так и останется непонятным.
думаю надо превью показывать тах файлов, которые загружены.
>if($type && $type[2] < 4)......
спасибо
>И разбирайтесь с многократными else... echo... написав так, чтобы пользователь понимал к какому изображению ваше echo относится.
ок
а как удалить из массива $_FILES пустое значение? | |
|
|
|
|
|
|
|
для: Bvz
(08.10.2010 в 15:53)
| | >думаю надо превью показывать тах файлов, которые загружены.
А если не загружено и ошибка?
Зачем вам удалять из массива $_FILES пустое значение? У вас некая специфическая задача, и это удаление будет оправдано? | |
|
|
|
|
|
|
|
для: sim5
(08.10.2010 в 16:05)
| | >>думаю надо превью показывать тах файлов, которые загружены.
>
>А если не загружено и ошибка?
сообщение об ошибке
>Зачем вам удалять из массива $_FILES пустое значение? У вас некая специфическая задача, и это удаление будет оправдано?
нет )) | |
|
|
|
|
|
|
|
для: Bvz
(08.10.2010 в 16:11)
| | Вы хотя бы выполните свой код, и посмотрите, можно ли будет определить у вас, какие из изображений не загрузились или вы их отвергли по тем или иным причинам? | |
|
|
|
|
|
|
|
для: sim5
(08.10.2010 в 16:15)
| | а как сделать, чтоб оно недогрузилось полностью? | |
|
|
|
|
|
|
|
для: Bvz
(08.10.2010 в 16:59)
| | Что оно? | |
|
|
|
|
|
|
|
для: sim5
(08.10.2010 в 17:02)
| | )) ну изображение, чтоб и на эту ошибку проверить | |
|
|
|
|
|
|
|
для: Bvz
(08.10.2010 в 17:06)
| | Прочтите в руководстве о кодах ошибок, которые могут возникать при загрузке файлов на сервер.
Запускайте тестовую форму, отправляя файл и печатайте содержимое массива FILES, дабы знать, что он содержит при различных ситуациях. | |
|
|
|
|
|
|
|
для: sim5
(08.10.2010 в 17:13)
| | UPLOAD_ERR_OK
Значение: 0; Ошибок не возникало, файл был успешно загружен на сервер.
UPLOAD_ERR_INI_SIZE
Значение: 1; Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini.
UPLOAD_ERR_FORM_SIZE
Значение: 2; Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.
UPLOAD_ERR_PARTIAL
Значение: 3; Загружаемый файл был получен только частично.
UPLOAD_ERR_NO_FILE
Значение: 4; Файл не был загружен.
как получить Значение: 3; Загружаемый файл был получен только частично.
UPLOAD_ERR_NO_FILE ? | |
|
|
|
|
|
|
|
для: Bvz
(08.10.2010 в 17:35)
| | Это не все ошибки, существуют еще:
UPLOAD_ERR_NO_TMP_DIR, код ошибки 6 - Отсутствует временная папка. Представлено в PHP 4.3.10 и PHP 5.0.3.
UPLOAD_ERR_CANT_WRITE, код ошибки 7 - Отказ в записи файла на диск. Представлено в PHP 5.1.0.
UPLOAD_ERR_EXTENSION, код ошибки 8 - Расширение PHP остановило загрузку файла. PHP не обеспечивает способ позволяющий установить, какое расширение остановило загрузку файла, может помочь только исследование списка загруженных расширений. Представлено в PHP 5.2.0.
Что значит получить? Вы что не знаете какой ключ содержит ошибки, и не можете получить ее код и узнать значение? Или как сымитировать неполную загрузку файла? | |
|
|
|
|
|
|
|
для: sim5
(08.10.2010 в 17:49)
| | >Это не все ошибки, существуют еще:
да я теперь знаю!
>Или как сымитировать неполную загрузку файла?
да | |
|
|
|
|
|
|
|
для: Bvz
(08.10.2010 в 17:54)
| | Просто так этого не сымитировать, да вам это и не нужно. | |
|
|
|
|
|
|
|
для: sim5
(08.10.2010 в 17:57)
| | в принципе да ))
и еще вопрос, как правильнее будет сначала переименовать файл и потом перемещать или переместит, а потом переименовать и соответственно изменить размеры, если нужно.
и еще вы написали при атаке при загрузке нужен помощник, что вы имели ввиду? | |
|
|
|
|
|
|
|
для: Bvz
(08.10.2010 в 17:59)
| | Вы перемещаете какой файл и от куда куда? А вы когда либо заглядывали в массив FILES и смотрели как он называется? Нука загляньте и попробуйте сами ответить на свой вопрос - есть ли тут вообще что-то имеющее в прямом смысле отношение к переименованию, относительно имени загруженного файла?
Изменить размеры можно не перемещая файл вообще никуда, если оригинальный файл не трубуется сохранять. В любом случае выгоднее производить операции с временным файлом, включая и изменение размеров. | |
|
|
|
|
|
|
|
для: sim5
(08.10.2010 в 18:15)
| | >Вы перемещаете какой файл и от куда куда?
из временной папки в нужную мне папку только что загруженное изображение
столкнулся с проблемой создания уникального имени
вот такой способ повторяет имя и получается одно изображение загружено вместо 3-х
$ext = strrchr($_FILES['photo']['name'][$i], ".");
$name = date("YmdHis", time("$i")).$ext; | |
|
|
|
|
|
|
|
для: Bvz
(09.10.2010 в 09:51)
| | Вы внимательно прочтите что содержат ключи массива FILES.
Ключ "name" содержит имя файла, но не сам файл, под которым он был на сервере.
Ключ "tmp_name" содежит путь и имя временного файла, который закачан на серер, и которые хранит бинарные данные самого файла загруженного, и называется этот файл, например, php152.tmp. Именно этот файл вы и будете перемещать, а не что-то под именем оригинальным с переименованием. Если уж и говорить о переименовании, то файла php152.tmp. Но нет тут переименования, вы указываете просто имя файлу под которым он сохранится - это копирование.
Это вы так учитываете? И это после того как вы на форуме неоднократно спрашивали о именовании файлов при загрузке их на сервер? Определять тип файла по расширению, это как поверить улыбке на лице с кирпичем в руке за спиною. Сколько еще раз вам повторять об этом, чтобы вы уяснили это в конце концов? Вы для чего выше определяли тип файла с помощью getimagesize() - только лишь для того чтобы убедиться то ли загрузили и забыть об этом?
time("$i") - можете объяснить с какого потолка вы эту ахинею содрали? Что сие вообще означает и как это можно понять? В каком руководстве вы такое прочли о функции time()? И к чему она у вас вообще здесь? | |
|
|
|
|
|
|
|
для: sim5
(09.10.2010 в 10:11)
| | >Это вы так учитываете? И это после того как вы на форуме неоднократно спрашивали о именовании файлов при загрузке их на сервер? Определять тип файла по расширению, это как поверить улыбке на лице с кирпичем в руке за спиною. Сколько еще раз вам повторять об этом, чтобы вы уяснили это в конце концов? Вы для чего выше определяли тип файла с помощью getimagesize() - только лишь для того чтобы убедиться то ли загрузили и забыть об этом?
ступил, знал что получу оплевуху за это, и все равно сделал вот исправил:
<?php
$ext = image_type($type[2]);
//где:
function image_type($type) {
switch ($type) {
case 1:
return '.gif';
case 2:
return '.jpg';
case 3:
return '.png';
}
}
?>
|
>
>time("$i") - можете объяснить с какого потолка вы эту ахинею содрали? Что сие вообще означает и как это можно понять? В каком руководстве вы такое прочли о функции time()? И к чему она у вас вообще здесь?
упс было: time() , просто экспериментировал чтоб сделать уникальное имя, а взя я из одной из книг авторов сего форума ))
>Вы внимательно прочтите что содержат ключи массива FILES.
>Ключ "name" содержит имя файла, но не сам файл, под которым он был на сервере.
>Ключ "tmp_name" содежит путь и имя временного файла, который закачан на серер, и которые хранит бинарные данные самого файла загруженного, и называется этот файл, например, php152.tmp. Именно этот файл вы и будете пермещать, а не что-то под именем оригинальным с переименованием. Если уж и говорить о переименовании, то файла php152.tmp. Но нет тут переименования, вы указываете просто имя файлу под которым он сохранится - это копирование.
>
я вот так делаю:
<?php
$ext = image_type($type[2]);
$name = date("YmdHis",time()).$ext;
$uploadfileoriginal = $uploaddiroriginal . $name;
if (move_uploaded_file($_FILES['photo']['tmp_name'][$i], $uploadfileoriginal))
{
echo "Файл успешно загружен.<br />";
}
?>
|
или надо было сначало переименовать, уменьшить в размере и потом переместить?
а как быть в ситуации, что еще надо превьюшку такую же сделать?
но не создается уникально имя, а просто перезаписываются один файл поверх другого, а как сделать уникальное имя? | |
|
|
|
|
|
|
|
для: Bvz
(09.10.2010 в 10:46)
| | Ради такого пустяка функция да еще со switch....
<?
$ext = array(1=>"gif","jpg","png");
$ext = ($inf = getimagesize($_FILES['photo']['tmp_name'][$i]) && $ext[$inf[2]]) ? $ext[$inf[2]] : null;
if($ext) {
//это изображение, работаем, и знаем расширение - $ext
//....
}
| Прежеде, чем что-то копировать вслепую, вы уж разберитесь, что все это значит, пусть это и чужой код, вернее тем более, если чужой. А чтобы убедиться в бесполезности здесь time(), могли бы выполнить:
<?
echo date("YmdHis",time()) . " - " . date("YmdHis");
| чтобы убедиться, что два случая дадут один и тот же результа, а чтобы понять почему, достаточно прочитать в мануале об этих функциях.
Такое именование файла тоже не гарантирует уникальности, ибо хоть и мала вероятность, но не исключается, что в тоже самое время другой пользователь будет производить загрузку файла, и если они будут помещаться в одну и ту же папку, значит возникнет баг. Поэтому можно добавлять к такому имени еще в качестве префикса/постпрефикса, например, имя пользователя, индентификатор сессии....
Обработка массива загруженных файлов может произойти и за меньшее время чем секунда, а значит и имена файлы могут получить одинаковые, следовательно сохраниться только последний файл. Поэтому можно учитывать индекс итерации при формировании имени, но никак ни таким образом как вы это пытались делать.
Вам еще раз повторить, что операцией переименования в прямом смысле этого слова тут и не пахнет? Вы суть происходящего понимаете? Если понимаете, извольте выражаться соответствующе.
А теперь самое главное, и то с чего все надо начинать - с задачи, которую вы пытаетесь решить. Не заплаток, которые вы клеите от попытки к попытке, а именно задаче в целом, в которой вы должны определить чего вы хотите, поставить вопросы и условия.
Я пониятия не имею, например, о том, нужно ли вам сохранять файл оригинал или нет, поэтому нужно ли вообще будет чего-то перемещать, даже и затрудняюсь ответить. Вы, даже после того, как я вам замечал, что цитирование моих слов в полном объеме совсем не нужно, продолжаете их цитировать, создавая в темах лишние и никчемные портянки. Так вот, вы лучше их не цитируйте, а читайте внимательно, потому, что необязательно переместить, а потом изменять размер, а работать с временным файлом, я вам уже говорил.
Скульптор добавляет кусочки глины в процессе работы, но добавляет их к основе, болванке, которая имеет уже основные очертания конечной работы. Вы пытаетесь клеить к своему коду куски, даже не зная в какое место их притулить. А посему, ищите в сети "блок-схема кода", ознакомтесь, что это такое, и хотя не обязательно вам нужно рисовать такую блок схему своей задачи (хотя это полезно для учебы), но в голове держать эту блок-схему необходимо, и не клеить неведомо куда кусочки, а решать узлы этой блок-схемы (задачи).
Пока вы не определитесь с этим главным, что и определит логику структуры вашего кода загрузки файлов, ко мне можете не обращаться с вопросами - отвечать не буду. А другие..., это уж не знаю. | |
|
|
|
|
|
|
|
для: sim5
(09.10.2010 в 12:15)
| | >чтобы убедиться, что два случая дадут один и тот же результа, а чтобы понять почему, достаточно прочитать в мануале об этих функциях.
я это опытным путем выяснил это!
>Поэтому можно добавлять к такому имени еще в качестве префикса/постпрефикса, например, имя пользователя, идентификатор сессии....
спасибо!!!
а в идентификаторе сесии всегда одинаковое число символов? наверное это не подойдет, т.к. он одинаковый при одновременной загрузки с одной формы.
>надо начинать - с задачи, которую вы пытаетесь решить.
1. Есть форма с помощью которой надо будет загрузить на сервер до 3-х изображений одновременно,
2. Проверить, чтоб они были не меньше заданного размера и являются графическими файлами.
3. Создать 2 изображения соответствующих размеров 800на600 и 200на150 и переместить в соответствующие папки с одинаковым уникальным именем файла
4. Записать в БД имя файла
>ищите в сети "блок-схема кода"
ищу, читаю, пробую
но там только программы, которые делаю блок схемы из кода | |
|
|
|
|
|
|
|
для: Bvz
(09.10.2010 в 12:43)
| | >я это опытным путем выяснил это!
Метод научного тыка неприемлим, если есть описание материала.
1., 2., 3., 4. - это не задача, это ее участки.
>но там только программы, которые делаю блок схемы из кода
Вам не программы нужны, вам надо понять из чего строится задача. Блок-схема не описывает подробности решения задачи, она показывает общую постановку ее, отражает цель главную и основные ее узлы, процесс ее выполнения. Вот и научитесь так формировать задачу, чтобы ваши участки 1,2,3,4 были логической цепью, выполнение которой бы и решало ее. При этом каждый из этих участков можно разбить на более мелкие задачи. Вот вы с мелочи и пытаетесь решать общее, а так не бывает.
Все, определяйтесь.
PS. Одновременно файлы никак не загружаются, это последовательный процесс. Это называется просто загрузкой нескольких файлов. | |
|
|
|
|
|
|
|
для: sim5
(09.10.2010 в 13:21)
| | ок, помогите тогда понять, что такое задача в вашем понимании7
я попробую ее определить:
создание банка фотографий по категориям. | |
|
|
|
|
|
|
|
для: Bvz
(09.10.2010 в 13:43)
| | Чтобы понять что такое задача, я вам могу задать несколько вопросов:
- а вы что грузите эти файлы на сервер ради интереса, или все таки следы этой загрузки где-то отражаются?
- файлы загружаются сами по себе или им сопуствует некая информация?
Есть форма.... Загрузить три файла.... это не задача, это ваши желания. Задача имеет основную цель, как-то, например, для чего эти изображения, являются ли они определяющими, и уже из основного ставятся более мелкие задачи - что для этого требуется, как это будет обрабатываться, и т.д., и т.п., так, чтобы это был логичный диалог с пользователем, и загрузка была не сама по себе, а определялась исходной постановкой задачи.
Вы же у меня спрашиваете перемещать и изменять, или изменять и перемещать? А я от куда знаю? Я понятия не имею, чего вам в общем плане нужно. | |
|
|
|
|
|
|
|
для: sim5
(09.10.2010 в 14:05)
| | Ясно:
на сайте есть раздел, который отображает список категорий в виде названия-превьшки(изображения), при нажатии на превьюшку открывается конкретная категория, где отображены названия категории, ее описание и до 3 превью, при нажатии которых открывается полное изображение. данные беруться из БД
через админку создается, редактируется и удаляется категория, т.е. название, описание.
а так же отдельно можно добавлять к категории изображения до 3-х штук, которые можно добавлять, редактировать, удалять.
собственно чем сейчас и занимаемся тут, т.е. через форму выбирается конкретная категория и до 3-х изображений. т.е. передается id категории и соответственно файлы.
ТАК? | |
|
|
|
|
|
|
|
для: Bvz
(09.10.2010 в 14:21)
| | Слава богу. Тогда почему вы не можете ответить себе из вот этого:
"Создать 2 изображения соответствующих размеров 800на600 и 200на150 и переместить в соответствующие папки...." ("с одинаковым уникальным именем файла" - отрежем, ибо одинаковыми имена никак не могут быть!)
на вопрос - что делать, если избоажение будет меньше чем "на", которое выжелаете? А если изображение будет 735х540, что тогда? А что вы будете делать, если изображение будет 800х600, а если уже 200х150? А ведь у вас в коде этого даже не отражено. Ответьте на эти вопросы, и вы будете знать - стоит ли вообще перемещать что-то, а если стоит то при каких условиях.
Если вы вместо этого начнете излагать былину, что это вы для себя делаете, и у вас все картинки исключительно не менее 801х601, то не надо, извольте решать поставленную задачу, найдите все возможные "если", которые могут возникнуть, и решайте их, либо принимайте решение, как поступать в данной ситуации. Будете знать как поступать, значит будете знать какой очередной шаг кода вашего последует.
Это редактирование и добавление, а если вы добавляете новую категорию, в это время запрещено добавлять изображения? А если не запрещено, тогда код ваш должен выгладеть как решение, которое вы можете подключить в двух этих случаях. А если идет добавление и категории, и изображения, вы ошибки проверяте, а если проверяте, то как быть с изображениями?
Вот так. | |
|
|
|
|
|
|
|
для: sim5
(09.10.2010 в 15:11)
| | >Функция copy() не годится для этого по некоторым соображениям, о которых вы таже можете прочесть в руководстве.
где конкретно, я не нашел?
есть временный файл который можно проверить с помощью функции is_uploaded_file() - $_FILES['photo']['tmp_name'] мы его переименовываем, я пока не нашел другого решения найти его? как с помощью $_SERVER['TMP'] и функции rename() - rename($_FILES['photo']['tmp_name'][$i], $_SERVER['TMP']."/test.jpg"); потом мы изменяем размер изображения и перемещаем его в нужную папку 2 способами copy и удаляем временный файл unlink() или используем снова rename, т.к. move_uploaded_file() уже не сработает.
либо переместить с помощью move_uploaded_file() в нужную папку, а далее мы его переименовываем и уменьшаем до нужного размера
по какому пути идти?
а пока осмысленно раз за разом перечитываю этот топик )) | |
|
|
|
|
|
|
|
для: Bvz
(10.10.2010 в 16:18)
| | Это написано в описании функции move_uploaded_file(), поясняя, почему она была введена в версии 4.0.3 специально для перемещения загруженных файл. Тем чем обладает эта функция, функция copy(), которая использовалась до версии 4 для этих целей, не обладает и теперь не рекомендуется в использовании в этих целях.
Вас что заклинило на переименовании? Ничего вы не будете переименовывать, в том смысле, как это бы вы делали функцией rename(string oldname, string newname), хотя имя и расширении (.tpm) перемещаемого файла будет заменено на то, что вы укажете во втором аргументе функции:
move_uploaded_file (string filename, string destination) - где string destination, это ваше сформированное уникальное имя для файла, той болванки, которую вы перетащите из временной папки, это имя и получит файл. Это тоже переименование, пусть, если можно так выразиться в "фоновом режиме". Вы же явно даже и не интересуетесь как называется файл временный, и это и не нужно. Можете называть это переименованием, но ради бога, ни в коем случае не думайте, что вы «переименовываете имя» под которым этот файл был на диске пользователя - вы можете только сохранить под этим именем, поместив это вторым аргументом функции move_uploaded_file(), но не переименовать - временный файл этого имени не имеет! Вот почему я вас все прошу - в данном случае забудьте вы термин "переименование", чтобы не путаться, а прочтите еще раз описание функции move_uploaded_file, чтобы понять, чего же переименовывается.
Вы обязаны сохранить файл, загруженный во временную папку, если вы этого не сделаете, он будет удален, поэтому unlink() совсем не нужен.
Уж я и не знаю, как вам еще объяснить казалось бы очевидное. Наверное, надо отвлекаться от программирования, и думать о чем-то отвлеченном, но по сути одинаковым с тем, чего вы пытаетесь сделать. Когда либо, чего-либо находили? Считайте, что нашли. Давайте представим, что вы, идя домой, нашли нечто. Покрутив, повертев эту штуковину, вы можете принять два решения, которые будут зависеть от параметров найденного. И так:
1. Эта находка по размерам, цвету и прочей конфигурации один в один подходит для нечто, что у вас есть дома. Что вы будете делать? Положите находку в карман и с приподнятым настроением «переместите находку с дороги домой».
2. Эта находка очень похожа на то, что вам нужно для нечто, что у вас есть дома. Но размеры не те, пимпочки по бокам ее тоже вам не нужны, и еще кое-что лишнее. Что вы будете делать? Что вы будете делать? Вы берете находку, несете ее знакомому мастеру Петровичу, он, осмотрев ее, послушав вас, чего вам надо, изготавливает по образу находки то, что вам как раз и надо. Вы даете Петровичу на жидкость, которой он поласкает горло после работы, берете изготовленное им в карман, и с приподнятым настроением «несете домой новую вещь». А вашу находку Петрович выбрасывает в помойку.
В первом случае вам ничего не требовалось делать с находкой, и вы ее взяли как есть. Во втором случае, она вам не подошла, но по облику ее вам изготовили то, чего требовалось, а сама находка вам-то ведь не подходит, вы ее потащите домой? Нет, конечно.
Вот тоже самое и с файлами. Я вам задавал вопросы по этому поводу, вы на них не ответили, а ответили бы себе, поняли бы, чего вам в конечном итоге надо.
Если у вас файлы более размера чем 800х600, то вы их уменьшаете с помощью GD-функций, с помощью ее же функций вы сохраняете результат на диск, под тем именем уникальным, которое вы сформировали. И не одно, а два имени, потому как вам надо сделать еще и маленькую копию изображения, поэтому вы и ему имя давать будете, например, добавив в конце имени для большого файла _small. В функцию уменьшения изображения вы передаете указатель на загруженный файл - $_FILES['photo']['tmp_name'][$i], откуда GD его и возьмет для работы. И если вам не нужен это файл для сохранения, то зачем вам его перемещать, переименовывать и т.д., и т.п.? Все, забыли о нем, мусорщик его удалит.
А если вам он нужен тоже? Или что вы будете делать, если файл менее 800х600, ведь уменьшать его не требуется? И если такое вам годится, значит, передаете указатель на него в функцию для уменьшения, там его сохраняете функцией GD (ибо открывать вам все равно его придется), делаете маленькую копию, сохраняете ее, а о закачанном временном файле опять просто забываете.
Вот так в общем, а конкретно…. Вы на заданные вам вопросы не отвечаете, а я должен догадываться, что вам посоветовать? | |
|
|
|
|
|
|
|
для: sim5
(10.10.2010 в 18:45)
| | отвечаю:
на вопрос - что делать, если избоажение будет меньше чем "на", которое выжелаете?
-не загружать, выдать сообщение, что изображение меньше допустимого размера
А если изображение будет 735х540, что тогда?
-см.выше
А что вы будете делать, если изображение будет 800х600, а если уже 200х150? А ведь у вас в коде этого даже не отражено.
-просто переместить без изменения размера | |
|
|
|
|
|
|
|
для: Bvz
(10.10.2010 в 19:12)
| | Вот и действуейте. Только маленькие копии все равно создавать, а значит...? | |
|
|
|
|
|
|
|
для: sim5
(10.10.2010 в 19:21)
| | только немного запутался с перемещениями, подскажите.
1 шаг загрузили файл во временную папку
2 шаг проверили на наличие ошибок
3 шаг проверили на то, что это графический файл
4 шаг проверили размеры
5 шаг переместили изображение предварительно изменив(оставив как есть) или изменили размер, а потом переместили
и т.д. | |
|
|
|
|
|
|
|
для: Bvz
(10.10.2010 в 19:26)
| | Я вам одно и тоже уже устал говорить. Во-первых, если вы это для себя делаете, и со своим сайтом работать будете только вы, еще ладно, иначе точно, будут вас проклинать словом недобрым и не раз, за такое администрирование. Да и вообще, интересная категория, требующая картинки 800х600. Я понимаю, что такую можно вывести в подробном описании, но почему столь жесткие ограничения, почему нелья 700+580? Если вы это не для себя, а картинки будущий пользователь не обязательно сам будет готовить, а искать среди готового, то представляю маты его в вашу сторону. Ну это так, к слову. Устал я уже вам что-то говорить.
1. Если нет ошибок загрузки - только тогда считать файл загруженным!
2. Проверка изображение или нет...
3. Проверка ваших условий на файл...
4. Сколько вам еще раз объяснять, чтобы наконец-то поняли - зачем вам перемещать файл, если у вас столь жесткие ограничения и обязательно в любом случае нужно готовить малый эскиз изображения????? Достаточно проверить в пунке 1 загрузку функцией is_uploaded_file(), без всякого перемещения уменьшить загруженное, и в функции уменьшения записать результаты. | |
|
|
|
|
|
|
|
для: sim5
(10.10.2010 в 19:40)
| | столкнулся с такой проблемой, при уменьшении изображения выдает ошибку Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 39252 bytes)
функция уменьшения следующая:
<?php
// Функция создающая уменьшенную копию фотографии $filename,
// которая помещается в файл $smallimage
// Уменьшенный вариант имеет ширину и высту равную
// $w и $h пикселам, соответственн.
function resizeimgH($filename, $smallimage, $w, $h)
{
// Имя файла с масштабируемым изображением
$filename = $filename;
// Имя файла с уменьшенной копией.
$smallimage = $smallimage;
// определим коэффициент сжатия изображения, которое будем генерить
$ratio = $w/$h;
// получим размеры исходного изображения
$size_img = getimagesize($filename);
// получим коэффициент сжатия исходного изображения
$src_ratio=$size_img[0]/$size_img[1];
// Здесь вычисляем размеры уменьшенной копии, чтобы при масштабировании сохранились
// пропорции исходного изображения
if ($ratio<$src_ratio)
{
$h = $w/$src_ratio;
}
else
{
$w = $h*$src_ratio;
}
// создадим пустое изображение по заданным размерам
$dest_img = imagecreatetruecolor($w, $h);
// создаем jpeg из файла
$src_img = imagecreatefromjpeg($filename);
// масштабируем изображение функцией imagecopyresampled()
// $dest_img - уменьшенная копия
// $src_img - исходной изображение
// $w - ширина уменьшенной копии
// $h - высота уменьшенной копии
// $size_img[0] - ширина исходного изображения
// $size_img[1] - высота исходного изображения
imagecopyresampled($dest_img, $src_img, 0, 0, 0, 0, $w, $h, $size_img[0], $size_img[1]);
// сохраняем уменьшенную копию в файл
imagejpeg($dest_img, $smallimage);
// чистим память от созданных изображений
imagedestroy($dest_img);
imagedestroy($src_img);
return true;
}
?>
|
как я понял не хватает памяти, не могу понять как решить сию проблему | |
|
|
|
|
|
|
|
для: Bvz
(12.10.2010 в 05:03)
| | В php.ini это регулируется - memory_limit. Но системные ресурсы выделяет хостер, так что на безразмерность не надейтесь, и не позволяйте загружать файлы размерами гарантированно порождающие такие проблемы.
А это зачем - return true;? | |
|
|
|
|
|
|
|
для: sim5
(12.10.2010 в 05:29)
| | спасибо поставлю проверку на максмально допустимый размер файла, а как правильно расчитать его?
>А это зачем - return true;?
не знаю это было в функции
разобрался как работать с файлами во временной папки спасибо, переношу в нужную папку с помощью rename, так? | |
|
|
|
|
|
|
|
для: Bvz
(12.10.2010 в 13:42)
| | А что такое изображение, если вы знаете глубину цвета (в битах) и его размеры? А если поискать Гуглом и почитать? Ведь пригодится.
Если не знаете, а кто-то написал это не подумавши, то зачем копируете? Функции могут возвращать результат выполнения операции, чтобы вы после обращения к ней могли знать это. В данном случае возврат ни к чему не обязывающий, он в любом случае у вас возвращает true, даже если не будет выполнена операция уменьшения изображения по тем или иным причинам. Так какой тогда прок от нее? Вы либо выбросите это, либо сделайте так, чтобы от возврата была польза, тем более в этом вполне есть оправданная необходимость.
>разобрался как работать с файлами во временной папки спасибо, переношу в нужную папку с помощью rename, так?
Чего?! Я вам для чего специально замечал, что даже функция copy() не годится для перемещения, а вы теперь за rename() взялись? Ну-ка читать мануал еще раз!
И сколько же раз вам еще повторять, чтобы вы уяснили, что вам вообще ничего никуда перемещать не надо, а имена файлов, под которыми вы их будете сохранять, формируете и отдаете функции уменьшающей изображение. Эта функция у вас и сохраняет на диск файлы. Какое еще перемещение и переименование вам нужно?
Говорил, чтобы вы всегда в голове держали всю задачу целиком, дабы знать чего требуется в общем, и в частностях на каждом ее этапе. Говорю, говорю, а все бес толку. Вот вы зачем проверяли допустимые типы файлов для загрузки? Вам это просто интересно было, или вы все-таки хотите загружать и GIF, и JPEG, и PNG? А если да, то чего это ваша функция уменьшает только JPEG, вы думаете, это универсально и она у вас откроет файл любого формата, типа сама догадается? Вы хотя бы разбирайте чужой код, читая о каждой ее функции, "мотая на ус" чего он там делает, а то копируете невесть что.... | |
|
|
|
|
|
|
|
для: sim5
(12.10.2010 в 14:06)
| | >Если не знаете, а кто-то написал это не подумавши, то зачем копируете? Функции могут возвращать результат выполнения операции, чтобы вы после обращения к ней могли знать это. В данном случае возврат ни к чему не обязывающий, он в любом случае у вас возвращает true, даже если не будет выполнена операция уменьшения изображения по тем или иным причинам. Так какой тогда прок от нее? Вы либо выбросите это, либо сделайте так, чтобы от возврата была польза, тем более в этом вполне есть оправданная необходимость.
а зачем тогда авторы сего форума в своих книгах такие решения предлгают, блин выходит все потраченные деньги пошли на поддержания авторов, а не на профрост ((
>>разобрался как работать с файлами во временной папки спасибо, переношу в нужную папку с помощью rename, так?
>
все стало на места, спасибо!!!
>Говорил, чтобы вы всегда в голове держали всю задачу целиком, дабы знать чего требуется в общем, и в частностях на каждом ее этапе. Говорю, говорю, а все бес толку. Вот вы зачем проверяли допустимые типы файлов для загрузки? Вам это просто интересно было, или вы все-таки хотите загружать и GIF, и JPEG, и PNG? А если да, то чего это ваша функция уменьшает только JPEG, вы думаете, это универсально и она у вас откроет файл любого формата, типа сама догадается? Вы хотя бы разбирайте чужой код, читая о каждой ее функции, "мотая на ус" чего он там делает, а то копируете невесть что...
протупил, бездумно скопировал, (покраснел) | |
|
|
|
|
|
|
|
для: Bvz
(12.10.2010 в 14:16)
| | Зачем забиваете форум мусором - зачем вы копируете слова мои целеком? Я что склерозом старческим страдаю и слов своих не помню, мысли своей высказанной? Охота цитировать, значит цитируйте основное. | |
|
|
|
|
|
|
|
для: sim5
(12.10.2010 в 14:22)
| | ок, еще пожелание будут, что почитать, изучить? | |
|
|
|
|
|
|
|
для: Bvz
(12.10.2010 в 14:44)
| | Желания должны быть у вас, а изучать то с чем будете сталкиваться - РНР, MySQL, HTML, как минимум. | |
|
|
|
|
|
|
|
для: sim5
(12.10.2010 в 15:24)
| | можете подсказать более универсальную функцию по созданию уменьшенной копии? | |
|
|
|
|
|
|
|
для: Bvz
(12.10.2010 в 15:32)
| | Универсального ничего нет в том смысле, что без телодвижений все само собой. Вы в мануал загляните, прочтите о функции imagecreatefromjpeg(), что она делает, и может ли она открывать файлы любых типов? Изучайте и думайте. | |
|
|
|
|
|
|
|
для: sim5
(12.10.2010 в 15:43)
| | вопросы по ходу прочтения темы еще раз:
1.
>Атака с помощью изображения без "помощника" практически не имеет перспективы,
что за "помощник"?
2.
Какой функцией удалять пустые значения из массива?
3.
без return true; функция не работает )) | |
|
|
|
|
|
|
|
для: Bvz
(13.10.2010 в 22:54)
| | 1. Если я благодаря тем или иным уязвимостям кода вашего, размещу у вас скрипт, а к хвостам безобидных и милых по виду картинок буду добавлять "его модули", то эти милые картинки превратятся в бомбы.
2. Какого массива? Массив массиву рознь, в одном это можно сделать просто, в другом только поэтапно, в третьем достаточно удалить пустые значения только у некоторых ключей.
Если речь идет о пустых элементах в массиве $_FILES, то во-первых надо хорошо знать, что содержит этот массив для каждого конкретного случая. Если необходимо удалить элементы у которых пустые поля ключа "name", то нужно удалять значения и других ключей, сопутствующие этому ключу . Сделать это можно пройдя циклом по массиву. Если же применять стандартные функции, то будут удалены элементы только этого ключа, остальные будут сохранены. Следовательно, чтобы удалить и другие незначащие элементы нужно задавать условия и для других ключей, значения у которых нужно тоже удалить. Для незагруженного файла с ключом "name" понятно, он пуст. Ключ "error" такого файла содержит код 4, и это задать в условии тоже не сложно, сложнее с ключом "size". Ключ "error" для загруженного файла содержит 0, но и ключ "size" для незагруженного файла содержит 0. То есть, если задать условие на удаление значений равных 0, как размер незагруженного файла, то будет удалено и нужное - информация об отсутствии ошибки у загруженных файлов. Следовательно, чтобы этого не произошло, при удалении значений массива, нужно проверять его ключ. Отсюда имеем:
<?
//исходный массив полей "file"
print_r($_FILES);
//удаляем незагруженные
array_walk($_FILES['file'], create_function('&$v,$k','$v = $k == "size" ? array_diff($v, array(0)) : array_diff($v, array("",4));'));
//результат
print_r($_FILES);
|
Удаление значений не изменяет индексы массивов ключей массива $_FILES. Следовательно, не всегда обязательно удалять все, а достаточно удалить только пустые значения ключа "name", если загрузка это большой массив, и этой загрузке сопутствует связанная с ним информация, а условием определено жестко - только И загрузка, И информация. Не стоит что-то делать лишнее, как то удаление пустого из массива, если это неоправдано.
3. Вы уверены в этом? Прежде чем такую чушь сморозить, вы хорошенько разберите каждую строку кода, и обратите внимание на то как вы вызываете функцию. | |
|
|
|
|
|
|
|
для: sim5
(14.10.2010 в 06:09)
| | >1. Если я благодаря тем или иным уязвимостям кода вашего, размещу у вас скрипт, а к хвостам безобидных и милых по виду картинок буду добавлять "его модули", то эти милые картинки превратятся в бомбы.
спасибо, а где почитать про такие уязвимости более подробно
>2. Какого массива?
спасибо, я имел ввиду массив $_FILES
>3. Вы уверены в этом?
да, вы не поверите, но убрав эту строку он не создает уменьшенную копию
и еще в догонку вопрос: 4 а как проверить расширение для других файлов не изображений? | |
|
|
|
|
|
|
|
для: Bvz
(14.10.2010 в 09:00)
| | В Интернете об уязвимостях информации хоть отбавляй.
Не надо мне о чедесах рассказывать. Еще раз говорю - разберите внимательно код свой. Возврат не занимается уменьшением, записью и т.п., его задача только информировать. Учитесь понимать код.
Лучше проверять файлы по их заголовкам, хотя подделать можно все. Но такая проверка, а не проверка по трем буквам, все таки предпочтительнее, иначе вместо файла можно получить содержимое, смысл которого будет равен ровно тем трем буквам, кои часто пишут на заборах. | |
|
|
|
|
|
|
|
для: sim5
(08.10.2010 в 12:56)
| | del | |
|
|
|
|