php - 将文件上传限制为一个文件 - PHP

标签 php file file-upload limit

我有一个文件输入元素,用于将个人资料图片上传到用户个人资料页面。默认浏览器只允许这个元素上传一个文件,除非你添加 multiple属性。
我想在 PHP 中设置一个备份,以防万一有人决定在 HTML 中添加“multiple”属性。
我想分配 $_POST superglobal 到一个变量并且有一个 if 语句说明这个值是否大于 1 会阻止这种情况,但事实并非如此?
解决这个问题的最佳方法是什么?我尝试了各种东西,例如 count()数组方法,但似乎无法找到解决看似非常简单的问题的方法?

if(isset($_POST['submit-profile-image'])) {

    $profileImage = $_POST['submit-profile-image'];

    if (isset($profileImage)) {
        if ($profileImage > 1) {
            $error[] = "You cannot upload more than one profile image";
        }
    }
    // ALL OTHER CODE
}
我也试过使用 $_FILES超全局并计算 $_FILES['profile-image'] 的实例.这遇到了一个不同的问题,因为它阻止了多个文件上传但也阻止了单个文件上传(我不明白为什么)?
if(isset($_FILES['profile-image'])){
    if(count($_FILES['profile-image']) > 1){
        $error[] = "You cannot upload more than one profile image";
    }
}

最佳答案

您无法阻止用户发送多个文件。你所能做的就是抵御这种可能性,并优雅地失败。
假设您的 HTML 包含此 <form>

<form method='post' enctype="multipart/form_data">
  <input type='file' name='uploadFile'>
  <input type='submit' name='submit'>
</form>
当用户选择一个文件并点击 submit浏览器将文件打包并发送,PHP 将文件解压到服务器磁盘,然后在$_FILES['uploadFile'] 中将文件详细信息呈现给您的程序。大批。
如果我们假设用户编辑了您的 HTML 并添加了 multiple然后浏览器将文件打包并发送。 PHP 将解压第一个文件并将其详细信息添加到 $_FILES['uploadFile']像以前一样。然后它将解压缩第二个文件并将其详细信息放在 $_FILES['uploadFile'] 中。 ,覆盖第一个文件。你的程序只看到一个文件,对任何其他文件一无所知,然后继续。
要获得两个文件,您的用户必须更改 file 的名称。输入使用数组语法,所以假设他将行更改为
  <input type='file' name='uploadFile[]' multiple>
现在 PHP 将文件详细信息解包到一组数组中。而不是拥有 $_FILES['uploadFile']['name']包含一个文件名的字符串,它变成了一个字符串数组。
您的代码很可能需要一个字符串,但很可能会阻塞数组并以某种意想不到的方式失败。您可以检查这种情况
if (is_array($_FILES['uploadFile']['name'])) {throw new Exception("Too many files");}
因此,我们的用户决定将这个额外的文件强加给您,现在添加了第二个 <input>到表格:
<form method='post' enctype="multipart/form_data">
  <input type='file' name='uploadFile'>
  <input type='file' name='uploadFile'>
  <input type='submit' name='submit'>
</form>
第二个文件覆盖第一个文件,因为它具有相同的名称。你的程序一点也不聪明,只用一个文件继续。因此用户更改了第二个 input 上的名称:
<form method='post' enctype="multipart/form_data">
  <input type='file' name='uploadFile'>
  <input type='file' name='uploadFileB'>
  <input type='submit' name='submit'>
</form>
您可以通过查看 count($_FILES) 来检查这一点。 ,但您的程序不会寻找第二个输入,因此无论如何它都会忽略它并继续处理第一个文件。如果用户还更改了名字,您的程序将看不到任何文件,如果他颠倒名称,您的程序将只看到第二个文件而忽略第一个文件。
或者,在 PHP.INI 中设置 PHP 配置值:
max_file_uploads = 1;
如果这样做,PHP 将忽略第二个和后续文件。您的代码仍然需要处理命名问题。使用 ini_set() 进行设置似乎没有任何影响。

关于php - 将文件上传限制为一个文件 - PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67978561/

相关文章:

php - 在 PHP 5.3.8 中禁用严格标准

php - 数据库问题,如何存储变化的数据结构

php - PDO 与 bindValue 绑定(bind)不起作用

php - 为什么 PHP DOM 不在自闭标签上包含斜杠?

javascript - 上传过程中取消异步jquery文件上传

javascript - 基于浏览器的安全 S3 上传 : signed policy doc or presigned URL?

c - fseek 和 ftell 函数无法在我的文件串联程序中循环工作

javascript - 编辑 Node 中的大文件

java - 如何在 while 循环中读取以特殊字符串结尾的文件?

html - 文件上传时IE8空白文件名