2014-07-21 55 views
-1

在我的上傳文件腳本中,我需要將上傳的文件名(它們都是圖像)更改爲用戶的userId上傳文件+其他一些內容的組合。PHP重命名上傳的文件破壞了其擴展

我有一切工作正常,但唯一的問題是,當我使用move_uploaded_file並指定一個新的文件名,那裏有一個新名稱的文件,但沒有擴展名。

無需爲擴展程序編寫任何更多代碼,我可以使用它的新名稱和原始擴展名獲取文件名嗎?

我目前做的:

$tempFile = $_FILES["file"]["tmp_name"]; 
$newName = 'userId'.time() 

if(move_uploaded_file($tempFile,$root.'/images/'.$userId.'/'.$newName)) { 

} 

但這樣結束......

enter image description here

這是相同的上傳文件,但沒有擴展名。如果我手動更改擴展名,我可以在那裏看到圖像。

+0

因爲你設置了與'$了newName =「用戶id」新的文件名。 time()',你爲什麼驚訝它有這個名字? – marekful

+0

您需要使用新文件名添加擴展名。 –

回答

0

您需要做的是首先從原始文件名中提取原始擴展名,然後將其添加到$ newname變量中。

的名稱需要在它的延伸,周圍有沒有辦法,如果你知道的擴展將永遠是你cvan

0

試試這個

$tempFile = $_FILES["file"]["tmp_name"]; 
$file = explode('.', $_FILES["file"]["tmp_name"]); 

$newName = 'userId'.time().'.'.$file[count($file)-1]; 

if(move_uploaded_file($tempFile,$root.'/images/'.$userId.'/'.$newName)) { 

} 
0

更改你的代碼:

$tempFile = $_FILES["file"]["tmp_name"]; 
$newName = 'userId'.time() . "." . substr($_FILES['file']['name'], strpos('.'), strlen($_FILES['file']['name'])); 

if(move_uploaded_file($tempFile,$root.'/images/'.$userId.'/'.$newName)) { 

} 
0

您設定$newName = 'userId'.time()新的文件名,你爲什麼驚訝的是它有名字嗎?

要保留原始擴展名,首先需要找到它,然後將其添加到新文件名。您可以使用Fileinfo的PHP擴展猜測文件擴展名:

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mimeType = finfo_file($finfo, $tempFile); 
finfo_close($finfo); 

// Set file extension & exif data, if any 
$exif = array(); 
switch ($mimeType) { 
    case 'image/png': 
     $fileExtension = 'png'; 

     break; 
    case 'image/gif': 
     $fileExtension = 'gif'; 
     break; 

    case 'image/jpg': 
    case 'image/jpeg': 
     $fileExtension = 'jpg'; 
     break; 
} 

然後,添加擴展到新的名稱:

$newName = 'userId' . time() . $fileExtension;