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

标签 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))
    {
        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";
    }
}

这会在当前文件名之前生成一个随机数,即 4593example.jpg 但我只想将整个文件名重写为 4593.jpg 删除 ucrrent 名称(示例)。当我尝试这样做时,我丢失了扩展名 (.jpg) 任何帮助表示赞赏。

最佳答案

如果您只处理图像,我会考虑使用 getimagesize() 检测图像的类型并根据那个给新文件一个扩展名。

这样,您就不必依赖从用户那里获得的扩展名(这可能是错误的)。

像这样:

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

  • HTTP_POST_FILES 已弃用,请改用 $_FILES

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

关于PHP 图片上传 - 重命名而不丢失扩展名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5141032/

相关文章:

php - 使用php表单将图片上传到mysql

ios - 以编程方式创建 sceneKit 文件(快速)

android - 如何在 Android 中打开所有 sdcard 文件?

python - 将文件转换为字典

javascript - 混合了我需要为我的 div 分开的 html 样式

php - 为 Web 开发人员设计测试

php - Laravel 5.4 迁移 ENUM 在 MySQL 中失败

javascript - 一次输入两种形式

ruby-on-rails - 有没有一个rails方法可以循环遍历上传文件的每一行? "each_line"是一个IO方法,但它不起作用

file - 我如何在fortran中声明MPI_File_set_view所需的整数(MPI_OFFSET_KIND),以防止写入大数据时溢出?