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()
会愚蠢地将配置文件复制到新位置,如果上传的是头像图像,您可以从新位置下载配置文件<代码>移动上传的文件()
将只移动实际上传的文件