【问题标题】:Jquery Validate Plugin addMethod for custom file size checker [duplicate]用于自定义文件大小检查器的 Jquery Validate Plugin addMethod [重复]
【发布时间】:2020-07-20 23:29:09
【问题描述】:

我正在尝试添加一种新方法来检查文件类型,然后根据类型检查大小。在这种情况下,我希望允许最大 10MB 的 jpg 文件和 4MB 的 gif、png 和 pdf 文件。上传字段不是必需的,但我仍然需要验证文件类型和类型的最大文件大小。目前,无论文件大小如何,都会显示错误。

我只想在所选文件大于其类型所允许的大小时显示错误。不知道我错过了什么。非常感谢任何帮助或反馈。

这是我的 HTML 代码

<form id="aspnetForm">
<p class="denote-required">
    <span class="required-symbol">*</span> = Required Field
</p>
<fieldset>
    <legend><h3>Details of item lost</h3></legend>
    <div class="form-group has-float-label required">
        <input
            type="text"
            id="date"
            name="date"
            class="form-control"
            data-toggle="datetimepicker"
            data-target="#date"
            placeholder=" "
            required />
        <label for="date">Date item lost</label>
    </div>
    <div class="form-group has-float-label required">
        <input
            type="text"
            id="route"
            name="route"
            class="form-control"
            placeholder=" "
            required />
        <label for="route">Route</label>
    </div>
    <div class="form-group has-float-label required">
        <textarea
            id="itemDescription"
            name="itemDescription"
            class="form-control"
            aria-describedby="descriptionHelpBlock"
            placeholder=" "
            required></textarea>
        <label for="itemDescription">Description</label>
        <div id="descriptionHelpBlock" class="form-text text-muted">
            <small>Please be as descriptive as possible, such as color, size, brand name etc.</small>
        </div>
    </div>
    <div class="input-group">
        <div class="custom-file">
            <input
            type="file"
            id="fileUpload"
            name="fileUpload"
            class="custom-file-input"
            aria-describedby="fileUploadHelpBlock" />
            <label for="fileUpload" class="custom-file-label">Add photo</label>
        </div>
        <div id="fileUploadHelpBlock" class="form-text text-muted">
            <small>File type can be .jpg, .jpeg, .gif or .png. The maximum file size limit for .jpeg/.jpg files is 10mb. The maximum file size limit for .gif and .png is 4mb</small>
        </div>
    </div>
</fieldset>
<fieldset>
    <legend><h3>Your contact infomation</h3></legend>
    <div class="form-group has-float-label required">
        <input
            type="text"
            id="name"
            name="name"
            class="form-control"
            placeholder=" "
            required />
        <label for="name">Name</label>
    </div>
    <div class="form-group has-float-label required">
        <input
            type="email"
            id="email"
            name="email"
            class="form-control"
            placeholder=" "
            required />
        <label for="email">Email</label>
    </div>
    <div class="form-group has-float-label">
        <input
            type="text"
            id="phone"
            name="phone"
            class="form-control"
            placeholder=" " />
        <label for="phone">Phone</label>
    </div>
</fieldset>
<fieldset>
    <legend><h3>Return by mail</h3></legend>
    <div class="custom-control custom-checkbox">
        <input
            type="checkbox"
            id="mailItem"
            name="mailItem"
            class="custom-control-input" />
        <label for="mailItem" class="custom-control-label">If found, return item by mail</label>
    </div>
    <div id="mailingAddress">
        <p>Please provide your mailng address to have the item mailed to you, if we are able to find it.</p>
        <div class="form-group has-float-label required">
            <input
                type="text"
                id="address"
                name="address"
                class="form-control"
                placeholder=" " />
            <label for="address">Address</label>
        </div>
        <div class="form-group has-float-label">
            <input
                type="text"
                id="address2"
                name="address2"
                class="form-control"
                placeholder=" " />
            <label for="address2">Address 2</label>
        </div>
        <div class="form-group has-float-label required">
            <input
                type="text"
                id="city"
                name="city"
                class="form-control"
                placeholder=" " />
            <label for="city">City</label>
        </div>
        <div class="form-group has-float-label required">
            <input
                type="text"
                id="state"
                name="state"
                class="form-control"
                placeholder=" " />
            <label for="state">State</label>
        </div>
        <div class="form-group has-float-label required">
            <input
                type="text"
                id="zipCode"
                name="zipCode"
                class="form-control"
                placeholder=" " />
            <label for="zipCode">Zip code</label>
        </div>
    </div>
</fieldset>
<hr />
<div class="ml-auto text-center">
    <button type="submit" class="btn btn-primary">Submit</button>
</div>

这里是js代码

const validateForm = (function ($, window, document, undefined) {

        $.validator.addMethod('maxFileSize', function (value, element) {
            return this.optional(element) || checkFileSize(value, element);
        });

        var checkFileSize = function (fileNames, files) {
            const ext = $(files);
            if ($.inArray(ext, ['gif', 'jpeg', 'jpg', 'png', 'pdf']) >= 0) {
                // Check file size
                const fileSize = $(element)[0].files[0].size;

                if (ext === 'gif' || ext === 'png' || ext === 'pdf') {
                    if (fileSize > 4000000) {
                        return false;
                    } else {
                        return true;
                    }
                } else {
                    if (ext === 'jpeg' || ext === 'jpg') {
                        if (fileSize > 10000000) {
                            return false;
                        } else {
                            return true;
                        }
                    }
                }
            }
        }

        const init = function () {

            // Set rules and messages
            $('#aspnetForm').validate({
                debug: true,
                errorElement: 'div',
                errorClass: 'is-invalid',
                validClass: 'is-valid',
                rules: {
                    fileUpload: {
                        required: false,
                        accept: 'image/gif,image/jpg,image/jpeg,image/png,application/pdf,',
                        maxFileSize: true,
                    },
                },
                messages: {
                    date: 'Please select a date.',
                    route: 'Please enter a route.',
                    description: 'Please enter a description.',
                    fileUpload: {
                        accept: 'The file selected is not a valid type.',
                        maxFileSize: 'The file selected is too large.',
                    },
                    name: 'Please provide your name.',
                    email: 'Please enter a valid email',
                    address: 'Please enter your street address.',
                    city: 'Please enter a city.',
                    state: 'Please enter a state.',
                    zipCode: 'Please enter a zip code.',
                },

                errorPlacement: function (error, element) {
                    // Add the `help-block` class to the error element
                    error.addClass('help-block');

                    element
                        .parents('.form-group, .input-group, .custom-control')
                        .addClass('has-feedback');

                    if (
                        element.prop('type') === 'checkbox' ||
                        element.prop('type') === 'radio'
                    ) {
                        error.appendTo(element.parents('.custom-control'));
                    } else if (
                        element.prop('type') === 'file'
                    ) {
                        error.appendTo(element.parents('.input-group'));
                    } else {
                        error.appendTo(element.parents('.form-group, .input-group'));
                    }
                },
                highlight: function (element, errorClass, validClass) {
                    $(element)
                        .parents('.form-group, .input-group, .custom-control')
                        .addClass(errorClass)
                        .removeClass(validClass);

                    // Sets error icon.
                    $(element)
                        .next('.alert-red')
                        .show();
                },
                unhighlight: function (element, errorClass, validClass) {
                    $(element)
                        .parents('.form-group, .input-group, .custom-control')
                        .addClass(validClass)
                        .removeClass(errorClass);
                    $(element)
                        .next('.alert-red')
                        .remove();
                },
            });

            // Show address form when checked
            $('#mailingAddress').hide();
            $('#mailItem').click(function () {
                if ($(this).is(':checked')) {
                    $('#mailingAddress').fadeIn(300);
                    $('#mailingAddress [aria-required="true"]').attr('required', 'required');
                } else if ($(this).is(':not(:checked)')) {
                    $('#mailingAddress').fadeOut(300);
                    $('#mailingAddress [aria-required="true"]').removeAttr('required', 'required');
                }
            });
        };

        return {
            init: init,
            checkFileSize: checkFileSize,
        };
    })(jQuery, window, document);

    $(document).ready(function () {
        validateForm.init();
    });

【问题讨论】:

    标签: jquery jquery-validate


    【解决方案1】:

    我没有在 checkFileSize 变量中正确设置“ext”。修复后,我还必须更新其中的 fileSize 变量。

    这是更新的js

    var checkFileSize = function (files) {
    const ext = files.files[0].name.split('.').pop().toLowerCase();
    if ($.inArray(ext, ['gif', 'jpeg', 'jpg', 'png', 'pdf']) >= 0) {
        // Check file size
        const fileSize = files.files[0].size;
    
        if (ext === 'gif' || ext === 'png' || ext === 'pdf') {
            if (fileSize > 4000000) {
                return false;
            } else {
                return true;
            }
        } else {
            if (ext === 'jpeg' || ext === 'jpg') {
                if (fileSize > 10000000) {
                    return false;
                } else {
                    return true;
                }
            }
        }
    }
    return false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多