我正在使用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目录中允许的最大文件数。
所以在演示代码中没有可以限制否的处理程序。在后端上传文件。
只是想知道我是否可以限制否。后端的文件上传?
当用户使用以下内容时会出现问题:
<input class="photo file" id="fileupload" name="images[]" type="file" multiple>
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;
}
以下代码:
myself
因为后端没有检查。
答案 0 :(得分:0)
在server/php/UploadHandler.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
中列出的文件,那么他将收到错误。
这解决了目的,防止了恶意企图,并为使用的文件上传过程增加了更多可靠性。