|
|
|
| Подскажите как сделать
1. чтобы файл который заливался, назывался не как в клиентской части, а
$_SESSION[login], это я сделал, но добавляетя еще и клиентское название типо, если логин user2, а название картинки было Картинка.jpg, то получится вот такое: user2Картинка.jpg
А мне нужно чтобы было просто user2 и формат файла тоже был, типо jpg это или gif.
2. чтобы файлы могли заливать только с форматом jpg,gif ?
if($_FILES["foto"]["size"] > 1024*3*1024)
{
echo ("Размер файла превышает три мегабайта");
exit;
}
if(copy($_FILES["foto"]["tmp_name"],"X:/home/localhost/www/site/img/res/$_SESSION[login]".$_FILES["foto"]["name"]))
{
echo("<a class='ok'>Фото успешно загружено</a> <br>");
} else {
echo("Не загружено");
}
|
| |
|
|
|
|
|
|
|
для: Ванек2010
(29.01.2010 в 14:32)
| |
<?php
if($_FILES["foto"]["size"] > 1024*3*1024)
{
echo ("Размер файла превышает три мегабайта");
exit;
}
if(copy($_FILES["foto"]["tmp_name"],"X:/home/localhost/www/site/img/res/$_SESSION[login]"))
{
echo("<a class='ok'>Фото успешно загружено</a> <br>");
} else {
echo("Не загружено");
}
?>
|
2. Создай массив с разрешенными типами файлов, а затем проверяй соответсвует ли $_FILES['foto']['type'] | |
|
|
|
|
|
|
|
для: ols
(29.01.2010 в 14:39)
| | Не copy, а move_uploaded_file.
X:/home/localhost/www/site/img/res/ - нельзя использовать таким образом абсолютный путь, на реальном сервере он не будет у вас работать. Да и не совсем обязательно, можно использовать относительный. | |
|
|
|
|
|
|
|
для: sim5
(29.01.2010 в 14:48)
| | Что значит на реальном сервере? не несите чушь прежде чем не проверить. move_uploaded_file, конечно же лучше использовать, об этом в мануале хорошо написано | |
|
|
|
|
|
|
|
для: ols
(29.01.2010 в 17:25)
| | А X:/home/localhost/www/site/img/res/ это стандартный путь на всех серверах? | |
|
|
|
|
|
|
|
для: sim5
(29.01.2010 в 17:27)
| | >А X:/home/localhost/www/site/img/res/ это стандартный путь на всех серверах?
Да блин $_SERVER['DOCUMENT_ROOT'] и делов-то. Но это уже невнимательность автора | |
|
|
|
|
|
|
|
для: ols
(29.01.2010 в 17:33)
| | Ну это же большая разница между X:/home/localhost/www/site/img/res/ и $_SERVER['DOCUMENT_ROOT'], а вы баги автора ему же и повторяете. | |
|
|
|
|
|
|
|
для: ols
(29.01.2010 в 14:39)
| | по 1. Я так пробывал, и типа файла нету, тоесть просто написано Файл, а что это картника или exe не пишет. А вот если оставить
<?php
if(copy($_FILES["foto"]["tmp_name"],"X:/home/localhost/www/rabota/img/res/$_SESSION[login]".$_FILES["foto"]["name"]))
?>
|
то тип файла определяет, но он еще добавляет название на клиентской части сам и выходит как я говорил в первом посте, тоесть user2Картинка.jpg | |
|
|
|
|
|
|
|
для: Ванек2010
(29.01.2010 в 14:32)
| | Используйте move_uploaded_file() вместо copy()
<?php
$size = getimagesize($_FILES['foto']['tmp_name']);
if ($size === false) {
// не картинка;
}
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1)); // формат картинки
$new_name = $_SESSION[login] . $format // логин.расширение
|
| |
|
|
|
|
|
|
|
для: neadekvat
(29.01.2010 в 14:52)
| | Получилось следущее))
<?php
if($_FILES["foto"]["size"] > 1024*3*1024 )
{
echo ("Размер файла превышает три мегабайта");
exit;
}
$size = getimagesize($_FILES['foto']['tmp_name']);
if ($size === false) {
// не картинка;
}
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1)); // формат картинки
$new_name = $_SESSION[login] . $format; // логин.расширение
if(move_uploaded_file($_FILES["foto"]["tmp_name"],"img/res/"."$new_name"))
{
echo("<a class='ok'>Фото успешно загружено</a> <br>");
} else {
echo("Не загружено");
} ?>
|
http://www.valar.ru/upload/gif/0110/123.htmНа картинке видно, что тип файла не определен.
Как его определить то? | |
|
|
|
|
|
|
|
для: Ванек2010
(29.01.2010 в 15:17)
| | А немножко подумать?
<?php $new_name = $_SESSION[login] . '.' . $format; // логин.расширение
|
| |
|
|
|
|
|
|
|
для: neadekvat
(29.01.2010 в 16:04)
| | > $new_name = $_SESSION[login] . '.' . $format;
Уязвимость. :) | |
|
|
|
|
|
|
|
для: Тень
(29.01.2010 в 17:04)
| | Это как же вы, интересно, значение в суперглобальном массиве $_SESSION замените? | |
|
|
|
|
|
|
|
для: neadekvat
(29.01.2010 в 17:12)
| | См. сюда: http://php.net/manual/en/function.exif-imagetype.php
Этот же список поддерживает getimagesize(), но далеко не все по умолчанию описаны в Apache, т.е. некоторые файлы не будут иметь корректного Content-type при отдаче.
Делаем логин "neadekvat.php", получаем "neadekvat.php.unknown_extension" (вместо "unknown_extension" одно из расширений для редких картинок). Apache это интерпретирует как PHP-скрипт, т.к. он не знает "unknown_extension", то будет смотреть дальше.
Либо, клинический такой случай, если разрешён байт 0x00 в логине. Там тупо отсекается расширение.
Нет, я соглашусь заранее, что логины не часто могут иметь точку и прочее. Но автор об этом не упоминал ни разу :( Ты должен был позаботиться, предупредить.
P.S. Можешь не благодарить за фишку с Apache ;) | |
|
|
|
|
|
|
|
для: Тень
(29.01.2010 в 17:19)
| | Ссылку на оф.документацию или источник.
Что за глупость, что апаче отсечет целый кусок имени файла и будет интерпритировать только его часть? | |
|
|
|
|
|
|
|
для: neadekvat
(29.01.2010 в 17:34)
| | [поправлено модератором] | |
|
|
|
|
|
|
|
для: Тень
(29.01.2010 в 17:35)
| | Вы так сказали о "фишке в апаче", что мне сразу страшно стало - а вдруг это никому не известная "фишка"? | |
|
|
|
|
|
|
|
для: neadekvat
(29.01.2010 в 17:36)
| | [поправлено модератором] | |
|
|
|
|
|
|
|
для: Тень
(29.01.2010 в 17:38)
| | Да нет, я все-таки подожду от вас ссылки. | |
|
|
|