PHP ile yüklenen bir dosyayı yeniden adlandırın ama uzantısı tutmak

6 Cevap php

Ben sunucuya bir form bir resim yükleyebilir ve görüntü lastname_firstname yeniden adlandırmak istiyorum PHP kullanıyorum. [Orjinal uzatma]. Şu anda var:

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]")

hangi, tabii ki, bir uzantısı olmadan dosya lastname_firstname adlandırır. Nasıl dosyasını yeniden adlandırın ama uzantısı tutabilirim?

Teşekkürler!

6 Cevap

Önce orijinal uzantısı ne olduğunu öğrenmek gerekir ;-)

Bunu yapmak için, pathinfo function harikalar yapabilirsiniz ;-)


Quoting the example that's given in the manual :

$path_parts = pathinfo('/www/htdocs/index.html');
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // since PHP 5.2.0

Size verecektir:

/www/htdocs
index.html
html
index


As a sidenote, don't forget about security :

Eğer insanlar, uzantısını kontrol etmeden, keyfi dosya yüklemek için izin varsa unutma, onlar gayet iyi ;) bir. Php dosya upload ve sunucusunda kod yürütebilir

Belirli bir klasör içindeki php yürütülmesine inkar etmek. Htaccess kuralları bu (sizin kurulum için terzi) gibi bir şeydir ..

AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI

Dosyaları karşıya klasörüne bir. Htaccess dosyasının içine koy.

Aksi takdirde, sadece birden fazla dosya olabileceğini akılda tutmak "." onlara ve size altın olmalıdır.

Sen deneyebilirsiniz:

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]".".".end(explode(".", $_FILES["picture"]["tmp_name"])))

veya Niels Bom önerilen

$filename=$_FILES["picture"]["tmp_name"];
$extension=end(explode(".", $filename));
$newfilename="$_POST[lastname]" . '_' . "$_POST[firstname]".".".$extension;
move_uploaded_file($filename, "peopleimages/" .$newfilename);

İlk olarak, uzantısı bulmak:

$pos = strrpos($filename, '.');
if($pos === false)
    $ext = ""; // file has no extension; do something special?
$ext = substr($filename, $pos); // includes the period in the extension; do $pos + 1 if you don't want it

Daha sonra istediğiniz zaten dosya aramak ve isim uzatma eklenecek:

$newFilename = "foobar" . $ext;
move_uploaded_file($_FILES['picture']['tmp_name'], 'peopleimages/' . $newFilename);

O EDIT Düşünme, bu hiçbiri uygunudur. Dosya uzantıları most often dosya türünü tanımlamak, ancak bu her zaman böyle değildir. Örneğin, bir. Jpg uzantısı bir. Png dosyayı yeniden adlandırmak, ve çoğu uygulamalar hala bir png dosyası olarak algılamak istiyorum. Bunun dışında, bazı işletim sistemleri sadece bir dosya türünü belirlemek için dosya uzantılarını kullanmayın.

$_FILE yüklenenler, aynı zamanda aldığınız dosyanın MIME türünü temsil eden bir type elemanı verilmiştir. Eğer yapabiliyorsanız, ben bunu yerine verilen uzantısı güveniyor öneririz:

$imagetypes = array(
    'image/png' => '.png',
    'image/gif' => '.gif',
    'image/jpeg' => '.jpg',
    'image/bmp' => '.bmp');
$ext = $imagetypes[$_FILES['myfile']['type']];

Bir more complete list of MIME types here olabilir.

Bu kod güvensizdir

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]". $extension);

eğer

$_POST[firstname] =mypicture.php%00

ve

$extension=.jpg;

this code is vulnerable ve result is

test.php%00.jpg //test.php uploaded on server.

Daha fazla bilgi için bu bağlantıyı kontrol edin:

https://www.owasp.org/index.php/Unrestricted_File_Upload

Her zaman olabilir:

$original = explode('.', $_FILES["picture"]["tmp_name"]);
$extension = array_pop($original);

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]". $extension);