如何在 jQuery 中限制最多 1 个文件上传 - 在 PHP 中从后端上传文件

How to limit maximum 1 file upload in jQuery-File-Upload from backend in PHP

我正在使用 jQuery-File-Upload 并尝试将最大图片上传限制为 1(单张图片上传)。

我正在使用位于 server/php/ 中的演示版本本身的示例 php 文件作为 UploadHandler.php

到目前为止,我已经阻止了在 JS 中拖放时的多张图片上传,但由于它只是在客户端,不能作为一个完整的证明解决方案来信任,我想知道我该如何限制最大号每个请求的上传数量

到目前为止我已经完成了:

<input class="photo file" id="fileupload" name="images" type="file">

在 JS 部分:

$('#fileupload').fileupload({
    url: url,
    dataType: 'json',
    autoUpload: true,
    dropZone: $('#fileupload'),
    singleFileUploads: false,
}).on('fileuploadadd', function (e, data) {
    //Hides error
    $('.error').hide().children().text('');
    var maxFileUploadAllowed = 1;
    var fileCount = data.files.length;
    if (fileCount > maxFileUploadAllowed) {
      $('.error').fadeIn().children().text("You are allowed to upload only 1 file");
      return false;
    }

这可以正常工作,但在后端限制 1 个文件也是必要的

在一些挖掘中我发现 options 中有一个参数作为 'max_number_of_files' => null, 我尝试将其更改为 1 但随后在每个文件上传时甚至在单个文件上传时它开始给出错误为 Maximum File limit exceeded

在进一步挖掘之后,我发现这个 if 语句中的检查在某种程度上是正确的并导致错误。

if (is_int($this->options['max_number_of_files']) &&
            ($this->count_file_objects() >= $this->options['max_number_of_files']) &&
            // Ignore additional chunks of existing files:
            !is_file($this->get_upload_path($file->name))) {
        $file->error = $this->get_error_message('max_number_of_files');
        return false;
    }

我做了 echo $this->count_file_objects(),发现它实际上返回了上传目录中允许的最大文件数。

因此演示代码中没有可以限制的处理程序。在后端上传文件的数量。

只是想知道是否有办法限制号码。后端的文件上传量?

当用户 fiddle 以下内容时会出现问题:

  1. 名称数组<input class="photo file" id="fileupload" name="images[]" type="file">
  2. "multiple" <input class="photo file" id="fileupload" name="images[]" type="file" multiple>
  3. 中的属性
  4. 或者fiddle跟下面的一块

代码如下:

var maxFileUploadAllowed = 1;
    var fileCount = data.files.length;
    if (fileCount > maxFileUploadAllowed) {
      $('.error').fadeIn().children().text("You are allowed to upload only 1 file");
      return false;
    }

因为后台没有check。

深入研究 server/php/UploadHandler.php

中演示中的 PHP 代码后

我发现上传过程正在 POST 上进行,因此调用 $this->post($this->options['print_response']); 方法来处理上传:

在此过程之前,validate() 中有一些初始验证:

protected function validate($uploaded_file, $file, $error, $index) {
    if ($error) {
        $file->error = $this->get_error_message($error);
        return false;
    }
    $content_length = $this->fix_integer_overflow(
        (int)$this->get_server_var('CONTENT_LENGTH')
    );
    $post_max_size = $this->get_config_bytes(ini_get('post_max_size'));
    if ($post_max_size && ($content_length > $post_max_size)) {
        $file->error = $this->get_error_message('post_max_size');
        return false;
    }
...
return true;
}

所以很明显 validate() 负责初步检查。

最初,在选项中,我添加了一个名为 max_files_upload_allowed: 1 的参数,然后我在 $error_messages 中添加了一条错误消息,如 'max_files_upload_allowed' => 'You are not allowed to upload multiple files at once'

然后我创建了我的方法 getUploadFilesCount() 来检查号码。用户添加到上传队列的文件数:

protected function getUploadFilesCount() {
      $file_upload_count = $this->get_upload_data($this->options['param_name']);
      return count($file_upload_count['name']);
    }

然后添加以下检查 validate()

//Check max_files_upload_allowed here
if (is_int($this->options['max_files_upload_allowed']) && (
        $this->getUploadFilesCount() > $this->options['max_files_upload_allowed'] &&
        $this->options['max_files_upload_allowed'] > 0)
    ) {
            $file->error = $this->get_error_message('max_files_upload_allowed');
    return false;
}

瞧!如果用户添加的文件多于 max_files_upload_allowed: 1 中列出的文件,那么他将收到错误。

这就解决了目的,防止恶意尝试并增加了所用文件上传过程的可靠性。