2012-03-23 84 views
17

我想知道是否可以更改要上载的文件的名称。我的意思是我想要做的是,用户上传一些文件,这些文件可能包含某些特殊字符,如某些欧洲语言中的特殊字符。使用PHP上传文件之前替换特殊字符

我打算做的是,在使用move_uploaded_file命令之前,可以使用普通字符更改/ preg_replace特殊字符,以便文件上传并使用只包含普通字符的新名称进行存储。

+0

这是可能的,是的。你有什么尝试? – 2012-03-23 12:15:53

回答

26
// Get the original file name from $_FILES 
$file_name= $_FILES['file']['name']; 

// Remove any characters you don't want 
// The below code will remove anything that is not a-z, 0-9 or a dot. 
$file_name = preg_replace("/[^a-zA-Z0-9.]/", "", $file_name); 

// Get the location of the folder to upload into 
$location = 'path/to/dir/'; 

// Use move_uploaded_file() 
move_uploaded_file($_FILES["file"]["tmp_name"], $location.$file_name); 
+0

@ 472084,你已经解决了我在ZIP文件和子目录或文件下的特殊字符这么长的问题。大。 :) – NullPointer 2013-09-04 07:59:16

+1

这很好,但你也必须为文件扩展名添加点。 $ file_name = preg_replace(“/ [^ a-zA-Z0-9。] /”,“”,$ file_name); – 2014-08-20 15:43:57

+0

它的工作原理,但没有改变/重命名文件名的路径位置 – jned29 2014-10-22 08:01:31

0

你可以得到原始文件名从$_FILES上传的文件,你可以创建你的“特别”版本通过用strtr(这听起来是这种情况的最佳匹配),str_replacepreg_replace或任何其他字符串处理函数替换它中的字符。

最好的方法取决于你想要做什么刚好

0

你可以像这样做,写一个简单的函数strip_special_chars()替换字符串你想要的字符

$tmp_name = $_FILES["file"]["tmp_name"]; 
$name = strip_special_chars($tmp_name); 
move_uploaded_file($name, "path/to/dir/"); 
+0

感谢你们的答案和示例代码,解决了它 – 125369 2012-03-23 12:45:50

0

您也可以使用功能的特殊字符是这样的:

function safename($theValue) 
{ 
    $_trSpec = array(
     'Ç' => 'C', 
     'Ğ' => 'G', 
     'İ' => 'I', 
     'Ö' => 'O', 
     'Ş' => 'S', 
     'Ü' => 'U', 
     'ç' => 'c', 
     'ğ' => 'g', 
     'ı' => 'i', 
     'i' => 'i', 
     'ö' => 'o', 
     'ş' => 's', 
     'ü' => 'u', 
    ); 
    $enChars = array_values($_trSpec); 
    $trChars = array_keys($_trSpec); 
    $theValue = str_replace($trChars, $enChars, $theValue); 
    $theValue=preg_replace("@[^A-Za-z0-9\-_.\/][email protected]","-",$theValue); 
    $theValue=strtolower($theValue); 
    return $theValue; 
} 

小心许可。用于文件扩展名。

,然后改变你原来的临时文件名,

$tempFile = $_FILES['Filedata']['tmp_name']; 
$targetFile = safename($targetFile); 

$location = 'path/to/dir/'; 
move_uploaded_file($_FILES["file"]["tmp_name"], $location.$targetFile);