2010-04-01 59 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

    相關問題