如何在PHP

时间:2016-11-06 19:41:25

标签: javascript php jquery jquery-file-upload blueimp

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

我正在使用示例版本中的示例php文件,该文件位于server/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; } 语句中的检查在某种程度上是正确的,并导致错误。

$this->count_file_objects()

我做了回复<input class="photo file" id="fileupload" name="images[]" type="file">,发现它实际上返回了uploads目录中允许的最大文件数。

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

只是想知道我是否可以限制否。后端的文件上传?

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

  1. 名称数组<input class="photo file" id="fileupload" name="images[]" type="file" multiple>
  2. &#34;多个&#34; 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; }
  3. 中的属性
  4. 或者摆弄以下
  5. 以下代码:

    myself

    因为后端没有检查。

1 个答案:

答案 0 :(得分:0)

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中列出的文件,那么他将收到错误。

这解决了目的,防止了恶意企图,并为使用的文件上传过程增加了更多可靠性。