2010-09-08 3 views
4

Я получил этот код из W3Schools, и отлажен его на основе этого один: Rename an uploaded file with PHP but keep the extensionкак переименовать загруженное изображение в PHP

Пожалуйста, помогите, что мне делать, так что расширение файла не будет .tmp Когда я загрузите его в папку на сервере.

<?php 
    $filename=$_FILES["file"]["tmp_name"]; 
    $extension=end(explode(".", $filename)); 
    $newfilename=$prod .".".$extension; 

    if ((($_FILES["file"]["type"] == "image/gif") 
    || ($_FILES["file"]["type"] == "image/jpeg") 
    || ($_FILES["file"]["type"] == "image/pjpeg")) 
    && ($_FILES["file"]["size"] < 100000)) 
     { 
     if ($_FILES["file"]["error"] > 0) 
     { 
     echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; 
     } 
     else 
     { 
     echo "Upload: " . $_FILES["file"]["name"] . "<br />"; 
     echo "Type: " . $_FILES["file"]["type"] . "<br />"; 
     echo "Size: " . ($_FILES["file"]["size"]/1024) . " Kb<br />"; 
     echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; 

     if (file_exists("../img/user_uploaded/" . $_FILES["file"]["name"])) 
      { 
      echo $_FILES["file"]["name"] . " already exists. "; 
      } 
     else 
      { 
      move_uploaded_file($filename, 
      "../img/user_uploaded/" . $newfilename); 
      echo "Stored in: " . "../img/user_uploaded/" .$newfilename; 
      } 
     } 
     } 
    else 
     { 
     echo "Invalid file, File must be less than 100Kb in size with .jpg, .jpeg, or .gif file extension"; 
     } 
    ?> 
+7

Я думаю, что я читал неизвестность/ужасы короткие истории, которые начинаются с «Я получил этот код из W3Schools». – JAL

+0

Вы должны принять один ответ как правильно :) – Wolfy

ответ

6
$filename=$_FILES["file"]["tmp_name"]; 
$extension=end(explode(".", $filename)); 
$newfilename=$prod .".".$extension; 

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

$filename=$_FILES["file"]["name"]; 
$extension=end(explode(".", $filename)); 
$newfilename=$prod .".".$extension; 

Это загрузит файл с фактическим расширением файла.

+0

в моем случае, это не будет загружать файл вообще. – user225269

1
rename('path/to/file/file.ext', 'path/to/file/newname.ext'); 

Эта функция является конкатенация копии и разъединить.

1

Эта часть переименовывает файл.

move_uploaded_file ($ filename, "../ img/user_uploaded /". $ Newfilename);

Итак, проблема заключается в том, как установить значение $ newfilename. Если у вас есть способ его создания, проблема решена.

1

Я не согласен с ответом @ Alexander.Plutov. Вам не нужно сохранять файл, а затем копировать его, а затем отключать его.

Поскольку вы указываете имя файла назначения в вашем коде:

move_uploaded_file($filename, "../img/user_uploaded/" . $newfilename); 
echo "Stored in: " . "../img/user_uploaded/" .$newfilename; 

все у вас есть, чтобы указать другое имя вместо $newfilename. Если ваша цель - заменить расширение .tmp чем-то другим, вы можете удалить последние четыре символа (которые всегда .tmp, заданы PHP), а затем добавить собственное расширение.

Если вы просто хотите сохранить расширение, задаваемое пользователем, используйте:

$friendlyName = $_FILES["file"]["name"]; 
$extension = substr($friendlyName, strrpos($friendlyName, '.') + 1); 

Конечно, вы должны быть осведомлены о риске использования что-то отвечал пользователем. Что делать, если расширение вообще отсутствует или оно слишком длинное, или если оно не соответствует реальному типу файла (deadly-virus.exe переименован в pretty-image.jpg)?

3

Попробуйте использовать эту библиотеку для манипулирования изображениями ... возможно, оффтопик, но очень полезен для работы с изображениями.

WideImage: http://wideimage.sourceforge.net/

Например:

include('path to WideImage.php'); 

$filename = $_FILES["file"]["name"]; 
$ext = strtolower(substr(strrchr($filename, '.'), 1)); //Get extension 
$image_name = $name . '.' . $ext; //New image name 

$image = WideImage::load($_FILES['file']['tmp_name']); //Get image 
$image->saveToFile('path/to/image/' . $image_name); //Save image 
+0

спасибо за это, мне также нужно манипулировать моим изображением – user225269

1

Небольшой пример, который вы можете использовать RAND() функцию для создания файла-имя случайного.

$min_rand=rand(0,1000); 
$max_rand=rand(100000000000,10000000000000000); 
$name_file=rand($min_rand,$max_rand);//this part is for creating random name for image 

$ext=end(explode(".", $_FILES["file"]["name"]));//gets extension 

move_uploaded_file($_FILES["file"]["tmp_name"],"/new folder/" . $name_file.".".$ext);//actually reponsible for copying file in new folder 

$filenameimage="../upload_image/" . $name_file.".".$ext; 
$actualimageurl="../upload_image/" . $_FILES["file"]["name"]; 
+0

'rand() ... rand() ... rand()' - Глубоко запутано: -S – jensgram

+0

Независимо от того, насколько огромный диапазон, который вы используете в своей случайной функции, он не на 100% безопасен. Вы можете дважды указать один и тот же номер и переопределить существующий файл. –

-1

Неинициализированная переменная $ prod! Это серьезный недостаток безопасности. Всегда инициализируйте свои переменные перед их использованием.

0

Вы можете добавить datetime в каталог, где вы загружаете его проще. Пример:

$date = date("Y-m-d H:i:s"); 

../img/user_uploaded/$date 

Но не только / в конце becouse это изменение каталога

Смежные вопросы