如何在PHP中重命名已上传的图片

8

我从w3schools得到了这段代码,并根据这个链接在PHP中重命名上传的文件但不改变扩展名进行了修改。

请帮忙,当我上传到服务器上的文件不要以.tmp为扩展名。

   <?php
    $filename=$_FILES["file"]["tmp_name"];
    $extension=end(explode(".", $filename));
    $newfilename=$prod .".".$extension;

    if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/pjpeg"))
    && ($_FILES["file"]["size"] < 100000))
      {
      if ($_FILES["file"]["error"] > 0)
        {
        echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
        }
      else
        {
        echo "Upload: " . $_FILES["file"]["name"] . "<br />";
        echo "Type: " . $_FILES["file"]["type"] . "<br />";
        echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
        echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

        if (file_exists("../img/user_uploaded/" . $_FILES["file"]["name"]))
          {
          echo $_FILES["file"]["name"] . " already exists. ";
          }
        else
          {
          move_uploaded_file($filename,
          "../img/user_uploaded/" . $newfilename);
          echo "Stored in: " . "../img/user_uploaded/" .$newfilename;
          }
        }
      }
    else
      {
      echo "Invalid file, File must be less than 100Kb in size with .jpg, .jpeg, or .gif file extension";
      }
    ?>

10
我认为我读过一些以“我从w3schools得到了这个代码”开头的悬疑/恐怖短篇小说。 - JAL
9个回答

8
$filename=$_FILES["file"]["tmp_name"];
$extension=end(explode(".", $filename));
$newfilename=$prod .".".$extension;

在上面的代码中,您正在尝试获取临时文件的扩展名。相反,您可以获取用户上传的原始文件名的扩展名。
$filename=$_FILES["file"]["name"];
$extension=end(explode(".", $filename));
$newfilename=$prod .".".$extension;

这将使用实际文件扩展名上传您的文件。

在我的情况下,这根本不会上传文件。 - user225269

6
rename('path/to/file/file.ext', 'path/to/file/newname.ext');

这个函数是复制和删除的拼接。

4

尝试使用这个图像处理库...可能有些离题,但在处理图像方面真的很有用。

WideImage: http://wideimage.sourceforge.net/

例如:

include('path to WideImage.php');

$filename = $_FILES["file"]["name"];
$ext = strtolower(substr(strrchr($filename, '.'), 1)); //Get extension
$image_name = $name . '.' . $ext; //New image name

$image = WideImage::load($_FILES['file']['tmp_name']); //Get image
$image->saveToFile('path/to/image/' . $image_name); //Save image

2

我不同意@Alexander.Plutov的答案。 您不必保存文件,然后复制它,再删除它

因为您在代码中指定了目标文件名:

move_uploaded_file($filename, "../img/user_uploaded/" . $newfilename);
echo "Stored in: " . "../img/user_uploaded/" .$newfilename;

你需要做的就是指定一个另外的名字代替$newfilename。如果你的目标是将.tmp扩展名替换为其他内容,那么你可以移除最后四个字符(这四个字符总是由PHP设置的.tmp),然后添加自己的扩展名。

如果你只想保留用户给出的扩展名,请使用:

$friendlyName = $_FILES["file"]["name"];
$extension = substr($friendlyName, strrpos($friendlyName, '.') + 1);

当然,您必须意识到使用用户发布的内容存在风险。如果没有文件扩展名呢?或者名称太长?或者它与真实文件类型不匹配(致命病毒.exe 重命名为漂亮图片.jpg)?

2

举个例子,你可以使用rand()函数创建随机文件名。

$min_rand=rand(0,1000);
$max_rand=rand(100000000000,10000000000000000);
$name_file=rand($min_rand,$max_rand);//this part is for creating random name for image

$ext=end(explode(".", $_FILES["file"]["name"]));//gets extension

move_uploaded_file($_FILES["file"]["tmp_name"],"/new folder/" . $name_file.".".$ext);//actually reponsible for copying file in new folder

$filenameimage="../upload_image/" . $name_file.".".$ext;
$actualimageurl="../upload_image/" . $_FILES["file"]["name"];

rand() ... rand() ... rand() -- 深感困惑 :-S - jensgram
无论您在随机函数中使用多大的范围,它都不是100%安全的。您可能会随机两次相同的数字并覆盖现有文件。 - user1705630

2

使用pathinfo()的最佳方式是:


$filename=$_FILES["file"]["name"];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$image_name = $yours_new_name.'.'.$ext;

1

这部分是重命名文件的代码。

move_uploaded_file($filename,"../img/user_uploaded/" . $newfilename);

问题在于如何设置$newfilename的值。 如果您有一种方法来生成它,那么问题就解决了。


0

未初始化变量$prod!这是一个严重的安全漏洞。在使用变量之前,一定要对它们进行初始化。


0

你可以将日期时间添加到上传目录中,这样会更方便。例如:

$date = date("Y-m-d H:i:s");

../img/user_uploaded/$date

但不要在结尾加上/,因为它会改变目录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接