繁体   English   中英

使用PHP重命名上传的文件但保留扩展名

[英]Rename an uploaded file with PHP but keep the extension

我正在使用PHP将图像从表单上传到服务器,并希望重命名图像lastname_firstname。[原始扩展名]。 我目前有:

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]")

当然,它没有扩展名重命名文件lastname_firstname。 如何重命名文件但保留扩展名?

谢谢!

你需要先找出原来的扩展名是什么;-)

要做到这一点, 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] ,以确保它只包含有效字符
  • 您还应该检查该文件是否为图像

你可以试试:

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);

不要忘记,如果你允许人们上传任意文件,而不检查扩展名,他们可以很好地上传.php文件并在你的服务器上执行代码;)

.htaccess规则拒绝在某个文件夹中执行php是这样的(为你的设置定制)..

AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI

将此文件放入.htaccess文件中,放入要上载文件的文件夹中。

否则,请记住文件可能有多个“。” 在他们身上,你应该是金色的。

这段代码不安全

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.

有关更多信息,请查看此链接:

https://www.owasp.org/index.php/Unrestricted_File_Upload

首先,找到扩展名:

$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']];

您可以在此处获得更完整的MIME类型列表

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]." . pathinfo($_FILES["picture"]["tmp_name"], PATHINFO_EXTENSION));

你总是可以:

$original = explode('.', $_FILES["picture"]["tmp_name"]);
$extension = array_pop($original);

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]". $extension);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM