2011-02-28 139 views
3

我目前有:PHP图片上传 - 重命名不丢失扩展名?

$file_name = $HTTP_POST_FILES['uid']['name']; 
$random_digit=rand(0000,9999); 
$new_file_name=$random_digit.$file_name; 
$path= "uploads/images/users/".$new_file_name; 
if($ufile !=none) 
{ 
    if(copy($HTTP_POST_FILES['uid']['tmp_name'], $path)) 
    { 
     echo "Successful<BR/>"; 
     echo "File Name :".$new_file_name."<BR/>"; 
     echo "File Size :".$HTTP_POST_FILES['uid']['size']."<BR/>"; 
     echo "File Type :".$HTTP_POST_FILES['uid']['type']."<BR/>"; 
    } 
    else 
    { 
     echo "Error"; 
    } 
} 

这产生一个随机数当前文件名即4593example.jpg 之前,但我只是想它来重写整个文件名4593.jpg去除ucrrent名称(例如) 。当我尝试这样做时,我失去了扩展名(.jpg) 任何帮助表示赞赏。

+0

你的问题解决了吗? – 2011-02-28 11:03:35

回答

3
$ext = pathinfo($filename, PATHINFO_EXTENSION); 

$newFilename = $random_digit . '.' . $ext; 

顺便说一句,如果随机数发生冲突(可能发生在下一个或10年),会发生什么?

有很多更好的方法来命名它们 - 例如,文件名的散列和time()从理论上应该不会发生冲突(虽然在实践中确实发生了散列冲突)。

3

你可以通过下面的代码原分机:

$extension = strrchr($HTTP_POST_FILES['uid']['tmp_name'], '.');

然后,您可以添加附加变量$new_file_name这样的:

$new_file_name = $random_digit . $file_name . '.' . $extension;

4

如果您只处理图片,我会考虑使用getimagesize()来检测图片的类型,并根据该图片为新文件提供一个扩展名。

这样,您不必依赖从用户那里得到什么扩展(这可能是错误的)。

像这样:

$extensions = array(
    IMAGETYPE_JPG => "jpg", 
    IMAGETYPE_GIF => "gif", 
    IMAGETYPE_PNG => "png", 
    IMAGETYPE_JPEG2000 => "jpg", 
    /* ...... several more at http://php.net/manual/en/image.constants.php 
      I'm too lazy to type them up */ 

); 

$info = getimagesize($_FILES['uid']['tmp_name']); 
$type = $info[2]; 

$extension = $extensions[$type]; 

if (!$extension) die ("Unknown file type"); 

move_uploaded_file($_FILES['uid']['tmp_name'], $path.".".$extension); 

` 另外:

  • 由于@alex说,你的方法有随机的名字的冲突的一个相当大的风险。您应该添加file_exists()检查,以防止

  • HTTP_POST_FILES已被弃用的(如循环,直到找到一个,创建一个新的随机数尚不存在),用$_FILES代替

  • 我强烈建议您可以使用move_uploaded_file()而不是copy(),这很容易受到攻击。

+0

+1绝对正确! – alex 2011-02-28 11:02:42

+0

使用'copy()'可以发生哪些攻击?谢谢。 – alex 2011-02-28 11:55:26

+0

@alex有/是一个漏洞 - 引入了'move_uploaded_file()'来响应它。实际上,我在2000年曾闯入一位朋友的phpBB中,或者其他东西:)等等,我会检查我是否可以找到链接。 – 2011-02-28 11:56:31

1

您可以使用此代码:

$file_name = $HTTP_POST_FILES['uid']['name']; $random_digit=rand(0000,9999); 
$extension= end(explode(".", $HTTP_POST_FILES['uid']['name'])); 
$new_file_name=$random_digit.'.'.$extension; $path= "uploads/images/users/".$new_file_name; if($ufile !=none) { if(copy($HTTP_POST_FILES['uid']['tmp_name'], $path)) { echo "Successful 
"; echo "File Name :".$new_file_name." 
"; echo "File Size :".$HTTP_POST_FILES['uid']['size']." 
"; echo "File Type :".$HTTP_POST_FILES['uid']['type']." 
"; } else { echo "Error"; } } 

享受!!!!!!!!!