2010-04-01 137 views
14

我使用PHP将图像从表单上传到服务器,并且想要重命名图像lastname_firstname。[original extension]。我目前有:使用PHP重命名上传的文件,但保留扩展名

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

其中,当然,重命名文件lastname_firstname没有扩展名。如何重命名文件但保留扩展名?

谢谢!

回答

28

您需要先找出原分机是;-)

为了做到这一点,在pathinfo功能可以创造奇迹;-)


报价是在给定的例子手动:

$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 

会给你:

/www/htdocs 
index.html 
html 
index 


一点题外话,不要忘记安全性:

  • 在你的情况,你应该逃避$_POST[lastname],以确保它仅包含有效字符
  • 您也应该检查该文件是一个图像
+0

我也用 is_uploaded_file() 功能检查,如果我们指向的文件实际上是一个上传的文件。 – 2010-04-01 19:30:20

+0

@Niels Bom:'move_uploaded_file'为你做到了。 – zneak 2010-04-01 19:43:01

+0

@zneak我站在纠正。 – 2010-04-01 20:13:09

0
move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]." . pathinfo($_FILES["picture"]["tmp_name"], PATHINFO_EXTENSION)); 
+1

这是一段*长*的代码行,大多数编码标准由于可读性差而提醒您。我建议你跟着他们。 – 2010-04-01 19:29:04

2

首先,找到5.3

  • 和/或finfo_file扩展名:

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

    然后打电话给你的文件无论如何你想要的,并追加到名的扩展名:

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

    编辑它思考,这一切都不是最佳的。文件扩展名最常见的是描述文件类型,但并非总是如此。例如,您可以将.png文件重命名为.jpg扩展名,并且大多数应用程序仍会将其检测为png文件。除此之外,某些操作系统根本不使用文件扩展名来确定文件的类型。

    使用$_FILE上传,您还获得了一个type元素,它代表您收到的文件的MIME类型。如果可以的话,我建议你依靠它,而不是在给定的扩展名:

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

    你可以有一个more complete list of MIME types here

  • +0

    我错过了双r!你是正确的先生! – mote 2010-04-01 19:11:31

    0

    你总是可以:

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

    你可以试试:

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

    或尼尔斯·汜建议

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

    这是一段*长*的代码行,大多数编码标准都建议不要这样做,因为可读性差。我建议你跟着他们。 – 2010-04-01 19:28:38

    +0

    这应该是更可读.. :-) – kviksilver 2010-04-01 19:41:28

    4

    不要忘记,如果你允许人们上传任意文件,没有检查,扩展名,他们可以很好地上传一个.php文件并在您的服务器上执行代码;)

    的规则的.htaccess拒绝特定的文件夹里面的PHP执行是这样的(量身定做适合你的设置)..

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

    将这个变成一个.htaccess文件到您上传文件的文件夹。

    否则,请记住文件可能有多个“。”。在他们中,你应该是金。

    3

    这个代码是不安全

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

    如果

    $_POST[firstname] =mypicture.php%00 
    

    $extension=.jpg; 
    

    这个代码是脆弱的,结果是

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

    的更多信息,请点击此链接:

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

    相关问题