【问题标题】:PHP validate upload and convert files based on file typePHP根据文件类型验证上传和转换文件
【发布时间】:2019-12-09 12:54:56
【问题描述】:

我必须按照以下代码使用 php 上传文件:

<!DOCTYPE html>
<html>
<head>
  <title>Upload your files</title>
</head>
<body>
  <form enctype="multipart/form-data" action="upload.php" method="POST">
    <p>Upload your file</p>
    <input type="file" name="uploaded_file"></input><br />
    <input type="submit" value="Upload"></input>
  </form>
</body>
</html>
<?PHP
  if(!empty($_FILES['uploaded_file']))
  {
    $path = "uploads/";
    $path = $path . basename( $_FILES['uploaded_file']['name']);

    if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $path)) {
      echo "The file ".  basename( $_FILES['uploaded_file']['name']). 
      " has been uploaded";
    } else{
        echo "There was an error uploading the file, please try again!";
    }
  }
?>

它的工作,但很好我的问题是如何添加/实现基于文件类型的安全验证并转换文件?

所有图片文件都应转换为jpg类型,所有视频文件应转换为mp4类型

在上传过程中,我还应该在文件中添加randon() 名称。

重要提示:验证后,所有图片应发送至upload/images/,所有视频应发送至upload/videos/

【问题讨论】:

    标签: php validation file-upload upload type-conversion


    【解决方案1】:

    您必须编写一个 switch 语句来阻止原始文件类型,然后使用多个库将原始文件类型转换为首选文件类型。

    switch ($originalfiletype){
    case '.png':
    //Process image through a .png to .jpg library
    break;
    case '.pdf':
    //Process image through a .pdf to .jpg library
    break;
    case '.webm':
    //Process video through .webm to .mp4 library
    break;
    default:
    echo "Your file type is not supported";
    break;
    }
    

    这个过程很不方便也很繁琐,可惜没有别的办法。 PHP 根本没有可以转换每种文件类型的内置库。

    【讨论】:

    【解决方案2】:

    您可以使用$_FILES["file"]["type"] 获取上传文件类型,但这可能不准确。您可以使用下面的代码来获取文件类型。

    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime_type = finfo_file($finfo, $temp_name);
    finfo_close($finfo);
    

    然后您可以检查$mime_type 是否在类似的位置,

    'image/jpeg' => FILE_TYPE_JPG,
    'image/jpg' => FILE_TYPE_JPG,
    'image/png' => FILE_TYPE_PNG,
    'image/gif' => FILE_TYPE_GIF,
    'video/mp4' => FILE_TYPE_MP4,
    'video/webm' => FILE_TYPE_WEBM,
    

    从上传文件的mimetype,您可以过滤您想要的图像和视频并删除不需要的文件。然后将图像和视频移动到不同的目录。

    要将视频传输到 mp4,您可以使用 ffmpeg -i example.mov example.mp4

    要将图像传输为 jpg,您可以使用convert 0000.png 0000.jpg

    对于随机名称,您可以使用md5_file($file_name) 作为文件名。

    请注意,在转换视频和图像时,ffmpeg 和 imagemagick convert 可能还有更多参数需要调整。

    【讨论】:

    • 一切看起来都不错,但不是随机的。这不会是真正随机的,将相同的文件上传两次,它会生成相同的数字。有很多方法可以做到这一点,但这里有一个选项 $r=bin2hex(random_bytes(10)).strtr(microtime(),['.'=&gt;'',' '=&gt;'']); 。额外的随机字符也会增加时间以避免可能的冲突。
    • php 中的convertffmpeg 在哪里?我需要安装一些东西吗?
    • @OtávioBarreto 您可以使用ffmpeg -versionconvert -V 在您的服务器上进行测试,以检查您的服务器是否默认安装了它们。如果没有,您必须自己安装它。对于安装,你可以谷歌ffmpegImagemagick(转换)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 2016-01-18
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2021-03-27
    • 2012-02-03
    相关资源
    最近更新 更多