Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP图像上传-重命名而不丢失扩展名?_Php_File - Fatal编程技术网

PHP图像上传-重命名而不丢失扩展名?

PHP图像上传-重命名而不丢失扩展名?,php,file,Php,File,我目前有: $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))

我目前有:

$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";
    }
}
$file_name=$HTTP_POST_FILES['uid']['name'];
$random_digit=兰特(00009999);
$new_file_name=$random_digit.$file_name;
$path=“uploads/images/users/”$new\u file\u name;
如果($ufile!=无)
{
如果(复制($HTTP_POST_文件['uid']['tmp_名称'],$path))
{
回显“成功
”; echo“文件名:”.$new_File_Name.“
”; echo“文件大小:”.$HTTP_POST_文件['uid']['Size'].“
”; echo“文件类型:”.$HTTP_POST_文件['uid']['Type'].“
”; } 其他的 { 回声“错误”; } }
这将在当前文件名ie 4593example.jpg之前生成一个随机数 但我只希望它将整个文件名重写为4593.jpg,删除ucrrent名称(示例)。当我尝试这样做时,我丢失了扩展名(.jpg)
非常感谢您的帮助。

您可以使用以下代码获得原始扩展名:

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

然后可以将扩展名添加到变量
$new\u file\u name
,如下所示:

$new\u file\u name=$random\u digit$文件名“”$扩展

$ext = pathinfo($filename, PATHINFO_EXTENSION);

$newFilename = $random_digit . '.' . $ext;
顺便说一句,如果随机数发生冲突(可能在未来或10年内发生),会发生什么


有很多更好的方法来命名它们。例如,文件名的哈希和<代码>时间()/代码>在理论上永远不会发生冲突(虽然实际上发生哈希冲突)。

< P>如果只处理图像,我会考虑使用图像的类型,并给新文件一个扩展。p> 这样,您就不必依赖用户提供的扩展(这可能是错误的)

像这样:

$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所说,您的方法有相当大的随机名称冲突风险。您应该添加一个
    文件\u exists()
    检查以防止出现这些情况(例如,循环创建一个新的随机数,直到找到一个尚不存在的随机数)

  • HTTP\u POST\u文件
    不推荐使用,请改用
    $\u文件

  • 我强烈建议您使用而不是易受攻击的
    copy()

您可以使用以下代码:

$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"; } }

享受

使用
copy()
会发生哪些攻击?谢谢。@alex有一个漏洞-
move\u-uploaded\u-file()
是作为响应引入的。事实上,我曾在2000年或其他时候用这个闯入过一个朋友的phpBB:)等等,我会检查我是否能找到链接。@alex weird,我现在找不到链接。无论如何,它的要点是您能够覆盖
$\u文件[“xyz”[“tmp\u name”]
,并在其中放置一个本地文件路径。如果您知道受攻击应用程序的结构,例如,您可以通过这种方式获取数据库配置文件
copy()
会愚蠢地将配置文件复制到新位置,如果上传的是头像图像,您可以从新位置下载配置文件<代码>移动上传的文件()
将只移动实际上传的文件