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

Форум PHP

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

 

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

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

тема: $_FILES сделать свое название файла и оставить его тип
 
 автор: Ванек2010   (29.01.2010 в 14:32)   письмо автору
 
 

Подскажите как сделать
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("Не загружено");
   }

  Ответить  
 
 автор: ols   (29.01.2010 в 14:39)   письмо автору
 
   для: Ванек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']

  Ответить  
 
 автор: sim5   (29.01.2010 в 14:48)   письмо автору
 
   для: ols   (29.01.2010 в 14:39)
 

Не copy, а move_uploaded_file.
X:/home/localhost/www/site/img/res/ - нельзя использовать таким образом абсолютный путь, на реальном сервере он не будет у вас работать. Да и не совсем обязательно, можно использовать относительный.

  Ответить  
 
 автор: ols   (29.01.2010 в 17:25)   письмо автору
 
   для: sim5   (29.01.2010 в 14:48)
 

Что значит на реальном сервере? не несите чушь прежде чем не проверить. move_uploaded_file, конечно же лучше использовать, об этом в мануале хорошо написано

  Ответить  
 
 автор: sim5   (29.01.2010 в 17:27)   письмо автору
 
   для: ols   (29.01.2010 в 17:25)
 

А X:/home/localhost/www/site/img/res/ это стандартный путь на всех серверах?

  Ответить  
 
 автор: ols   (29.01.2010 в 17:33)   письмо автору
 
   для: sim5   (29.01.2010 в 17:27)
 

>А X:/home/localhost/www/site/img/res/ это стандартный путь на всех серверах?
Да блин $_SERVER['DOCUMENT_ROOT'] и делов-то. Но это уже невнимательность автора

  Ответить  
 
 автор: sim5   (29.01.2010 в 17:45)   письмо автору
 
   для: ols   (29.01.2010 в 17:33)
 

Ну это же большая разница между X:/home/localhost/www/site/img/res/ и $_SERVER['DOCUMENT_ROOT'], а вы баги автора ему же и повторяете.

  Ответить  
 
 автор: Ванек2010   (29.01.2010 в 14:52)   письмо автору
 
   для: 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

  Ответить  
 
 автор: neadekvat   (29.01.2010 в 14:52)   письмо автору
 
   для: Ванек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 // логин.расширение

  Ответить  
 
 автор: Ванек2010   (29.01.2010 в 15:17)   письмо автору
 
   для: 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На картинке видно, что тип файла не определен.
Как его определить то?

  Ответить  
 
 автор: neadekvat   (29.01.2010 в 16:04)   письмо автору
 
   для: Ванек2010   (29.01.2010 в 15:17)
 

А немножко подумать?
<?php $new_name $_SESSION[login] . '.' $format// логин.расширение

  Ответить  
 
 автор: Тень   (29.01.2010 в 17:04)   письмо автору
 
   для: neadekvat   (29.01.2010 в 16:04)
 

> $new_name = $_SESSION[login] . '.' . $format;

Уязвимость. :)

  Ответить  
 
 автор: neadekvat   (29.01.2010 в 17:12)   письмо автору
 
   для: Тень   (29.01.2010 в 17:04)
 

Это как же вы, интересно, значение в суперглобальном массиве $_SESSION замените?

  Ответить  
 
 автор: Тень   (29.01.2010 в 17:19)   письмо автору
 
   для: 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 ;)

  Ответить  
 
 автор: neadekvat   (29.01.2010 в 17:34)   письмо автору
 
   для: Тень   (29.01.2010 в 17:19)
 

Ссылку на оф.документацию или источник.
Что за глупость, что апаче отсечет целый кусок имени файла и будет интерпритировать только его часть?

  Ответить  
 
 автор: Тень   (29.01.2010 в 17:35)   письмо автору
 
   для: neadekvat   (29.01.2010 в 17:34)
 

[поправлено модератором]

  Ответить  
 
 автор: neadekvat   (29.01.2010 в 17:36)   письмо автору
 
   для: Тень   (29.01.2010 в 17:35)
 

Вы так сказали о "фишке в апаче", что мне сразу страшно стало - а вдруг это никому не известная "фишка"?

  Ответить  
 
 автор: Тень   (29.01.2010 в 17:38)   письмо автору
 
   для: neadekvat   (29.01.2010 в 17:36)
 

[поправлено модератором]

  Ответить  
 
 автор: neadekvat   (29.01.2010 в 17:47)   письмо автору
 
   для: Тень   (29.01.2010 в 17:38)
 

Да нет, я все-таки подожду от вас ссылки.

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

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