提问者:小点点

MaxFilesize和接受FileTypes在蓝筹文件上传插件不工作。为什么啊?


我正在使用Blueimp jQuery文件上传插件来上传文件。

我在上传没有问题,但选项maxFilesize接受FileType不工作。

这是我的代码:

$(document).ready(function () {
    'use strict';

    $('#fileupload').fileupload({
        dataType: 'json',
        autoUpload: false,
        acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
        maxFileSize: 5000000,
        done: function (e, data) {
            $.each(data.result.files, function (index, file) {
                $('<p style="color: green;">' + file.name + '<i class="elusive-ok" style="padding-left:10px;"/> - Type: ' + file.type + ' - Size: ' + file.size + ' byte</p>')
                    .appendTo('#div_files');
            });
        },
        fail: function (e, data) {
            $.each(data.messages, function (index, error) {
                $('<p style="color: red;">Upload file error: ' + error + '<i class="elusive-remove" style="padding-left:10px;"/></p>')
                    .appendTo('#div_files');
            });
        },
        progressall: function (e, data) {
            var progress = parseInt(data.loaded / data.total * 100, 10);

            $('#progress .bar').css('width', progress + '%');
        }
    });
});

共3个答案

匿名用户

有同样的问题,blueimp的家伙说“maxFileSize和AcceptFileType只受UI版本的支持”,并提供了一个(断开的)链接来合并_validate和_hasError方法。

因此,在不知道如何合并这些方法而不弄乱脚本的情况下,我编写了这个小函数。这似乎对我有用。

再加上这个

add: function(e, data) {
        var uploadErrors = [];
        var acceptFileTypes = /^image\/(gif|jpe?g|png)$/i;
        if(data.originalFiles[0]['type'].length && !acceptFileTypes.test(data.originalFiles[0]['type'])) {
            uploadErrors.push('Not an accepted file type');
        }
        if(data.originalFiles[0]['size'].length && data.originalFiles[0]['size'] > 5000000) {
            uploadErrors.push('Filesize is too big');
        }
        if(uploadErrors.length > 0) {
            alert(uploadErrors.join("\n"));
        } else {
            data.submit();
        }
},

在比赛开始时。文件上传选项,如此处代码所示

$(document).ready(function () {
    'use strict';

    $('#fileupload').fileupload({
        add: function(e, data) {
                var uploadErrors = [];
                var acceptFileTypes = /^image\/(gif|jpe?g|png)$/i;
                if(data.originalFiles[0]['type'].length && !acceptFileTypes.test(data.originalFiles[0]['type'])) {
                    uploadErrors.push('Not an accepted file type');
                }
                if(data.originalFiles[0]['size'].length && data.originalFiles[0]['size'] > 5000000) {
                    uploadErrors.push('Filesize is too big');
                }
                if(uploadErrors.length > 0) {
                    alert(uploadErrors.join("\n"));
                } else {
                    data.submit();
                }
        },
        dataType: 'json',
        autoUpload: false,
        // acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
        // maxFileSize: 5000000,
        done: function (e, data) {
            $.each(data.result.files, function (index, file) {
                $('<p style="color: green;">' + file.name + '<i class="elusive-ok" style="padding-left:10px;"/> - Type: ' + file.type + ' - Size: ' + file.size + ' byte</p>')
                .appendTo('#div_files');
            });
        },
        fail: function (e, data) {
            $.each(data.messages, function (index, error) {
                $('<p style="color: red;">Upload file error: ' + error + '<i class="elusive-remove" style="padding-left:10px;"/></p>')
                .appendTo('#div_files');
            });
        },
        progressall: function (e, data) {
            var progress = parseInt(data.loaded / data.total * 100, 10);

            $('#progress .bar').css('width', progress + '%');
        }
    });
});

您会注意到,我在其中还添加了一个filesize函数,因为这也只适用于UI版本。

更新以通过@lopsided:添加的数据建议的问题。原始文件[0]['type']。长度数据。原始文件[0]['size']。在测试错误之前,首先检查查询的长度,以确保它们存在且不为空。如果它们不存在,则不会显示错误,并且只依赖于服务器端错误测试。

匿名用户

你应该包括jquery.fileupload-process.js和jquery.fileupload-validate.js使其工作。

匿名用户

正如前面的回答中所建议的,我们需要包括两个额外的文件-jquery。文件上传过程。js然后是jquery。文件上传验证。js但是,由于在添加文件时需要执行一些额外的ajax调用,因此我订阅了fileuploadadd事件来执行这些调用。关于这种用法,这个插件的作者建议如下

请看这里:https://github.com/blueimp/jQuery-File-Upload/wiki/Options#wiki-回调选项

通过bind(或使用jQuery 1.7的on方法)添加额外的事件侦听器是通过jQuery文件上载UI版本保留回调设置的首选选项。

或者,您也可以在自己的回调中启动处理,如下所示:https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.fileupload-process.js#L50

使用这两个建议选项的组合,下面的代码非常适合我

$fileInput.fileupload({
    url: 'upload_url',
    type: 'POST',
    dataType: 'json',
    autoUpload: false,
    disableValidation: false,
    maxFileSize: 1024 * 1024,
    messages: {
        maxFileSize: 'File exceeds maximum allowed size of 1MB',
    }
});

$fileInput.on('fileuploadadd', function(evt, data) {
    var $this = $(this);
    var validation = data.process(function () {
        return $this.fileupload('process', data);
    });

    validation.done(function() {
        makeAjaxCall('some_other_url', { fileName: data.files[0].name, fileSizeInBytes: data.files[0].size })
            .done(function(resp) {
                data.formData = data.formData || {};
                data.formData.someData = resp.SomeData;
                data.submit();
        });
    });
    validation.fail(function(data) {
        console.log('Upload error: ' + data.files[0].error);
    });
});