我正在使用PHP将图像从表单上传到服务器,并希望重命名图像lastname_firstname。[原始扩展名]。我目前有:
move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]")
当然,重命名文件lastname_firstname而不使用扩展名。如何重命名文件但保留扩展名?
谢谢!
答案 0 :(得分:31)
您需要先了解原始扩展名是什么; - )
为此, pathinfo
功能可以创造奇迹; - )
引用手册中给出的示例:
$path_parts = pathinfo('/www/htdocs/index.html');
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // since PHP 5.2.0
会给你:
/www/htdocs
index.html
html
index
作为旁注,不要忘记安全性:
$_POST[lastname]
,以确保它只包含有效的字符
$_POST['lastname']
- 请参阅Why is $foo[bar]
wrong? mime_content_type
了解PHP< 5.3 finfo_file
for PHP> = 5.3 答案 1 :(得分:4)
您可以尝试:
move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]".".".end(explode(".", $_FILES["picture"]["tmp_name"])))
或者Niels Bom建议
$filename=$_FILES["picture"]["tmp_name"];
$extension=end(explode(".", $filename));
$newfilename="$_POST[lastname]" . '_' . "$_POST[firstname]".".".$extension;
move_uploaded_file($filename, "peopleimages/" .$newfilename);
答案 2 :(得分:4)
不要忘记,如果你允许人们上传任意文件而不检查扩展名,他们就可以很好地上传.php文件并在你的服务器上执行代码;)
拒绝在某个文件夹中执行php的.htaccess规则是这样的(为你的设置定制)..
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI
将此文件放入.htaccess文件中,放入要上传文件的文件夹中。
否则,请记住文件可能有多个“。”在他们身上,你应该是金色的。
答案 3 :(得分:3)
此代码不安全
move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]". $extension);
如果
$_POST[firstname] =mypicture.php%00
和
$extension=.jpg;
此代码易受攻击且结果为
test.php%00.jpg //test.php uploaded on server.
有关更多信息,请查看此链接:
答案 4 :(得分:2)
首先,找到扩展名:
$pos = strrpos($filename, '.');
if ($pos === false)
{
// file has no extension; do something special?
$ext = "";
}
else
{
// includes the period in the extension; do $pos + 1 if you don't want it
$ext = substr($filename, $pos);
}
然后以你想要的方式调用你的文件,并将名称附加到扩展名:
$newFilename = "foobar" . $ext;
move_uploaded_file($_FILES['picture']['tmp_name'], 'peopleimages/' . $newFilename);
编辑想一想,这一切都不是最优的。文件扩展名最常用描述文件类型,但情况并非总是如此。例如,您可以将.png文件重命名为.jpg扩展名,大多数应用程序仍会将其检测为png文件。除此之外,某些操作系统根本不使用文件扩展名来确定文件的类型。
上传$_FILE
后,您还会获得一个type
元素,该元素代表您收到的文件的MIME类型。如果可以的话,我建议您依赖它而不是给定的扩展名:
$imagetypes = array(
'image/png' => '.png',
'image/gif' => '.gif',
'image/jpeg' => '.jpg',
'image/bmp' => '.bmp');
$ext = $imagetypes[$_FILES['myfile']['type']];
答案 5 :(得分:0)
move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]." . pathinfo($_FILES["picture"]["tmp_name"], PATHINFO_EXTENSION));
答案 6 :(得分:0)
你可以随时:
$original = explode('.', $_FILES["picture"]["tmp_name"]);
$extension = array_pop($original);
move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]". $extension);