【问题标题】:Javascript validation to insert file of specific nameJavascript验证插入特定名称的文件
【发布时间】:2017-12-11 14:09:46
【问题描述】:

我想在Javascript 中进行验证,文件名应该是特定类型的,应该像示例一样上传。

我有一个文件上传控件,它具有上传多个文件的功能。

这是它的 html。

<asp:FileUpload runat="server" ID="flufileUpload" AllowMultiple="true" onchange="return ValidateFileType(this);" />

所以在上传时我希望用户上传特定名称的文件

喜欢:-

一个用户只能上传5个文件,名字只有as

1 -&gt; 120.jpg

2 -&gt; 150.jpg

3 -&gt; 180.jpg

4 -&gt; 210.jpg

5 -&gt; 240.jpg

如果用户上传的文件名不是这个,那么它应该提示警报消息。

我处理一些验证的函数如下。但我无法处理文件名验证。

function ValidateFileType(controlName) {
    try {
        var uploadControl = controlName;
        var isCValidFile = false;

        for (var i = 0; i < uploadControl.files.length; i++) {
            isCValidFile = false;

            var path = uploadControl.files[i].name;
            var ext = path.substring(path.lastIndexOf(".") + 1, path.length).toLowerCase();

            if (path != "") {
                for (var j = 0; j < ValidImageFileExtension.length; j++) {
                    if (ext == ValidImageFileExtension[j]) {
                        isCValidFile = true;
                        break;
                    }
                }
                if (!isCValidFile) {
                    jAlert("Invalid File. Please upload a File with extension " + ValidImageFileExtension.join(", "), "Information");
                    uploadControl.value = '';
                    isCValidFile = false;
                    break;
                }
                else if (uploadControl.files[i].size > 15728640) {
                    jAlert("Please check file size should be less than 15 MB.", "Information");
                    uploadControl.value = '';
                    isCValidFile = false;
                    break;
                }
            }
            else {
                jAlert("Please select File", "Information");
                isCValidFile = false;
                break;
            }
        }

        return isCValidFile;

    } catch (e) {
        isCValidFile = false;
        jAlert("Error occurred on validate file.", "Error");
        return isCValidFile;
    }
}

【问题讨论】:

  • 你已经让循环通过files 数组,所以你需要做的就是使用this code 来获取文件名,然后检查它是否与你允许的任何值匹配。
  • @RoryMcCrossan:你能建议如何在循环中绑定这些名称
  • @RoryMcCrossan:我很困惑。请帮忙
  • 你想使文件名唯一还是只是文件有预定的名字?
  • @MehmetOtkun:文件具有预定名称。正如我给出的名字是具体的

标签: javascript jquery asp.net validation file-upload


【解决方案1】:

您可以使用有效文件名的对象检查文件名,并且您还需要知道哪个选项卡处于活动状态。您可以使用以下代码

var Tabtype = document.getElementById('hdnType').value; 

if (Tabtype == "Panaromic") { 
    var validFileName = { 
         "120.jpg": 1, "150.jpg": 1, "180.jpg": 1, "210.jpg": 1, "240.jpg": 1, 
    } 
} 

if (Tabtype == "Satellite") { 
    var validFileName = { 
          "55.jpg": 1, "74.jpg": 1, "83.jpg": 1, "935.jpg": 1, 
    } 
} 

if (Tabtype == "SitePlot") { 
    var validFileName = 0; 
}


if (path != "") {
   if(validFileName && !isFileNameValid(path)){
       jAlert("Invalid File. Please upload a File with extension " + 
       ValidImageFileExtension.join(", "), "Information");
       uploadControl.value = '';
       isCValidFile = false;
       break;
   }
   ...

【讨论】:

  • 使用catch (e) { console.log(e);查找问题
  • 得到错误Unable to get property 'split' of undefined or null reference
  • 使用 google chrome 检查器在您获得 path 变量的位置添加断点并检查它为什么会为 null 或未定义
  • 您可以删除该循环,因为您已经检查了函数中的文件名和扩展名
【解决方案2】:

在实践中,我会在这里做两件事之一。为 jQuery Validation 插件编写自定义适配器或编写自定义 jQuery 插件。

我通常使用jQuery validation,因此我会根据需要编写自定义适配器。这是有益的,因为一旦编写完成,我就可以反复重用规则,并且可以通过更改 Html 元素的属性来配置它们。它还具有动态显示错误消息和禁用表单提交的好处,而无需我的交互。

这是一个使用 Jquery Validation 的工作示例:

$(document).ready(function() {
  $.validator.addMethod("filecount", function(value, element, params) {
    var maxcount = params;
    if (maxcount) {
      return $(element)[0].files.length <= Number(maxcount);
    }
    return true;
  }, "Maximum number of files exceeded");

  $.validator.addMethod("filename", function(value, element, params) {

    if (!params) return true;
    var names = params.split(',');
    var files = $(element)[0].files;
    for (var i = 0; i < files.length; i++) {
      var file = files[i];
      if (names.indexOf(file.name.toLowerCase()) == -1) return false;
    }
    return true;

  }, "File name is not allowed");

  var mb = 1048576;
  var defaultmaxfilesize = mb * 15;

  $.validator.addMethod("filesize", function(value, element, params) {
    var el = $(element);
    var parsedmaxval = parseInt(el.attr("data-val-filesize-max"));
    var maxval = null;
    if (isNaN(parsedmaxval) || parsedmaxval < 1 || parsedmaxval > 1048576000) {
      maxval = defaultmaxfilesize;
    } else {

      maxval = parsedmaxval;
    }

    var files = el[0].files;
    if (files != null && files.length > 0) {
      for (var i = 0; i < files.length; i++) {
        var file = files[i];
        var size = file.size;
        if (maxval < Number(size)) return false;
      }
    }
    return true;

  }, "File is too large");
});
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8" />
  <title></title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script>



  <script>
    $(document).ready(function() {

      $('input[type="file"]').change(function() {

        var el = $(this);

        if (!el.valid()) el.val('');
      });
    });
  </script>
</head>

<body>
  <form id="form1" name="form1" action="/root" method="Post">
    <div>
      <input type=file 
          ID="flufileUpload" 
          multiple 
          data-msg-filename="File name must be '120.jpg, 150.jpg, 180.jpg, 210.jpg, or 240.jpg'" 
          data-rule-filename="120.jpg,150.jpg,180.jpg,210.jpg,240.jpg" 
          data-msg-filesize="Maximum File Size is 15 MB" 
          data-rule-filesize="15728640"
          data-msg-filecount="You can only upload 5 files" 
          data-rule-filecount="5" />


    </div>
    <div>
      <input type=file 
          ID="flufileUpload2" 
          name="flufileUpload2" 
          multiple 
          data-msg-filename="File name must be '480.jpg, 640.jpg, or 1024.jpg'" 
          data-rule-filename="480.jpg,640.jpg,1024.jpg" 
          data-msg-filesize="Maximum File Size is 10 MB" 
          data-rule-filesize="10485760"
          data-msg-filecount="You can only upload 5 files" 
          data-rule-filecount="5" />
    </div>
  </form>
</body>

</html>

在 MVC 中工作时,我使用 jQuery Unobtrusive Validation 适配器,它的 api 略有不同,对于这个问题,可能看起来像这样:

$.validator.unobtrusive.adapters.add("filecount", ["filecount"], function (options) {
    options.rules["filecount"] = "#" + options.params.param;
    options.messages["filecount"] = options.message;
});

$.validator.addMethod("filecount", function (value, element, params) {

    var maxcount = $(element).attr("data-val-filecount-max");
    if (maxcount) {
        return $(element)[0].files.length <= Number(maxcount);
    }
    return true;

});
$.validator.unobtrusive.adapters.add("filenames", ["filename"], function (options) {
    options.rules["filename"] = "#" + options.params.param;
    options.messages["filename"] = options.message;
});

$.validator.addMethod("filename", function (value, element, params) {

    var names = $(element).attr("data-val-filename-allowed").split(',');
    var files = $(element)[0].files;
    for (var i = 0; i < files.length; i++) {
        var file = files[i];
        if (names.indexOf(file.name.toLowerCase()) == -1) return false;
    }
    return true;

});

var mb = 1048576;
var defaultmaxfilesize = mb * 15;

$.validator.unobtrusive.adapters.add("filesize", ["filesize"], function (options) {
    options.rules["filesize"] = "#" + options.params.param;
    options.messages["filesize"] = options.message;
});

$.validator.addMethod("filesize", function (value, element, params) {
    var el = $(element);
    var parsedmaxval = parseInt(el.attr("data-val-filesize-max"));
    var maxval = null;
    if (isNaN(parsedmaxval) || parsedmaxval < 1 || parsedmaxval > 1048576000) {
        maxval = defaultmaxfilesize;
    } else {

        maxval = parsedmaxval;
    }

    var files = el[0].files;
    if (files != null && files.length > 0) {
        for (var i = 0; i < files.length; i++) {
            var file = files[i];
            var size = file.size;
            if (maxval < size) return false;
        }
    }
    return true;


});

然后我可以根据需要使用验证属性来装饰我的元素:

<input 
    type=file 
    ID="flufileUpload" 
    multiple data-val-filename="File name must be '120.jpg, 150.jpg, 180.jpg, 210.jpg, or 240.jpg'" 
    data-val-filename-allowed="120.jpg,150.jpg,180.jpg,210.jpg,240.jpg"
    data-val-filesize="Maximum File Size is 15 MB"
    data-val-filesize-max="15728640"
    data-val-filecount="You can only upload 5 files"
    data-val-filecount-max="5"
/>

为不同的元素使用不同的值只是改变属性的问题:

<input 
    type=file 
    ID="flufileUpload" 
    multiple data-val-filename="File name must be '480.jpg, 640.jpg, or 1024.jpg'" 
    data-val-filename-allowed="480.jpg,640.jpg,1024.jpg"
    data-val-filesize="Maximum File Size is 10 MB"
    data-val-filesize-max="10485760"
/>

我会采取的另一种方法是创建一个自定义 jQuery 插件。这允许通过将选项传递给插件来配置自定义功能。我通常只在需要自定义功能时才采用这种方法,例如在文件通过 AJAX 验证后自动上传文件,或者需要对错误消息进行精细控制。

一旦编写好您的插件,就可以根据需要使用自定义选项调用,如下所示:

 <script>
        $(document).ready(function () {
            $('#flufileUpload').fileValidate({ maxcount: 5, allowedFileNames: "file1.html,file2.html,file3.html" });
        });
    </script>

自定义插件看起来像这样,但通常您会将插件 JavaScript 放在自己的文件中,以便您可以根据需要重用它:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <style type="text/css">
        #qrcode {
            width: 160px;
            height: 160px;
            margin-top: 15px;
        }
    </style>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script>
        (function ($) {
            $.fn.fileValidate = function (options) {
                var Container = $(this);
                var id = Container.attr("id");
                var mb = 1048576;
                var settings = $.extend({
                    maxfilesize: mb * 15,
                    allowMultiple: true,
                    allowedFileNames: null,
                    allowedExtensions: ".png,.gif,tif,.tiff,.jpg,.jpeg,.bmp,.pdf",
                    maxcount: -1,
                    documentRemoveCallback: null,
                    target: null,
                    errlab: null
                }, options);

                var getErrorLabel = function () {
                    var validator = $('span[data-val-msgfor="' + id + "']");
                    if (validator.length == 0) {
                        validator = $("<span/>");
                        validator.attr("data-val-msgfor", id);
                        Container.parent().append(validator);
                    }
                    return validator;
                }
                var formatBytes = function formatBytes(bytes, decimals) {
                    if (bytes == 0) return '0 Bytes';
                    var k = 1024,
                        dm = decimals + 1 || 3,
                        sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
                        i = Math.floor(Math.log(bytes) / Math.log(k));
                    return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
                };
                var validExtensions = (settings.allowedExtensions) ? settings.allowedExtensions.split(",") : [];
                var validFileNames = (settings.allowedFileNames) ? settings.allowedFileNames.split(",") : [];
                var errlab = settings.errlab || getErrorLabel();
                var hasError = false;
                var errors = [];
                var setError = function (s) {
                    errors.push(s);

                }
                var getErrorHtml = function () {
                    var ul = $("<ul>");
                    errors.forEach(function (err) { ul.append($("<li>").html(err)); });
                    return ul;
                }
                var validateSize = function (files) {
                    for (var i = 0; i < files.length; i++) {
                        if (files[i].size > settings.maxfilesize) return false;
                    }
                    return true;
                }
                var validateExenstions = function (files) {
                    var invalid = [];
                    for (var i = 0; i < files.length; i++) {
                        var file = files[i];
                        var parts = file.name.split(".");
                        var ext = parts[parts.length - 1].toLowerCase();
                        var found = false;
                        validExtensions.forEach(function (x) {
                            if (x == ext) found = true;
                        });
                        !found && invalid.indexOf(ext) == -1 && invalid.push(ext);
                        if (!found) return false;
                    }
                    return true;

                }
                var validateFileNames = function (files) {
                    for (var i = 0; i < files.length; i++) {
                        var file = files[i];
                        if (validFileNames.indexOf(file.name) == -1) return false;
                    }
                    return true;
                }
                var onDocumentChange = function () {
                    errors = [];
                    var el = Container[0];
                    errlab.html('');
                    var files = el.files;

                    settings.maxcount > 0 && files.length > settings.maxcount && setError("You may only select " + settings.maxcount + " file(s).");
                    validExtensions.length > 0 && !validateExenstions(files) && setError("File extensions must be '" + settings.allowedExtensions + "'.");
                    settings.maxfilesize > 0 && !validateSize(files) && setError("Maximum file size is " + formatBytes(settings.maxfilesize) + ".");
                    validFileNames.length > 0 && !validateFileNames(files) && setError("Files names must be one of the following: '" + settings.allowedFileNames + "'.");
                    errors.length > 0 && $(Container).val(''), errlab.html('').append(getErrorHtml());
                    if (settings.documentChangeCallBack) { window.setTimeout(settings.documentChangeCallBack, 1); }
                };
                Container.change(onDocumentChange);
            };
        }(jQuery));
    </script>
</head>
<body>




    <input type=file ID="flufileUpload" multiple />
    <script>
      
    </script>
    <script>
        $(document).ready(function () {
            $('#flufileUpload').fileValidate({ maxcount: 5, allowedFileNames: "file1.html,file2.html,file3.html" });
        });
    </script>

</body>
</html>

【讨论】:

    【解决方案3】:

    在示例 html 中复制粘贴下面的代码。希望它按您的预期工作。

    <!DOCTYPE html>
        <html>
        <head>
          <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
          <title></title>
        </head>
        <body>  
          <label for="file">Filename:</label>
            <input type="file" name="filename" id="filename" onchange="ValidateFileType();" multiple="multiple"/> 
        </body>
    
    
    <script>
    function ValidateFileType() {
    
    var ext_names = ["jpg", "png", "jpeg"];
    
        try {
            var uploadControl = document.getElementById('filename');
            var isCValidFile = false;
    
            for (var i = 0; i < uploadControl.files.length; i++) {
                isCValidFile = false;
                var path = uploadControl.files[i].name;
                var ext = path.substring(path.lastIndexOf(".") + 1, path.length).toLowerCase();
                alert(path);
                if (path != "") {
    
                alert(ext);
                        if (ext_names.indexOf(ext) > -1) {
                            isCValidFile = true;    
                           // break;
                        }
    
                    if (!isCValidFile) {
                        alert("Invalid File. Please upload a File with extension " + ext_names.join(", "), "Information");
                        uploadControl.value = '';
                        isCValidFile = false;
                        break;
                    }
                    else if (uploadControl.files[i].size > 15728640) {
                        alert("Please check file size should be less than 15 MB.", "Information");
                        uploadControl.value = '';
                        isCValidFile = false;
                        break;
                    }
                }
                else {
                    alert("Please select File", "Information");
                    isCValidFile = false;
                    break;
                }
            }
    
            return isCValidFile;
    
        } catch (e) {
            isCValidFile = false;
            alert("Error occurred on validate file.", "Error");
            return isCValidFile;
        }
    }
    </script>
    
    
        </html>
    

    试试这个代码...

    【讨论】:

      【解决方案4】:

      如果您只想验证特定的文件名,这很容易。无需检查扩展。但是,如果您想让文件名唯一,您可以在后端进行。

      function ValidateFileType(controlName) {
        try {
             var uploadControl = controlName;
             var isCValidFile = false;
             var validFileNames = ["120.jpg","150.jpg","180.jpg","210.jpg","240.jpg"]
      
             for (var i = 0; i < uploadControl.files.length; i++) {
                 var file = uploadControl.files[i];
                 var fileName = file.name.split(/(\\|\/)/g).pop().toLowerCase();
                 if (validFileNames.indexOf(fileName) < 0) {
                    jAlert("Invalid file name, please select etc...",  "Information");
                 }
                 else if (file.size > 15728640) {
                         jAlert("Please check file size should be less than 15 MB.",  "Information");
                 }
                 else {
                     isCValidFile = true;
                 }
      
                 if(!isCValidFile)
                     uploadControl.value = '';
             }
      
             return isCValidFile;
      
         } catch (e) {
             uploadControl.value = '';
             jAlert("Error occurred on validate file.", "Error");
             return false;
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-07-24
        • 1970-01-01
        • 1970-01-01
        • 2022-12-11
        • 2017-03-18
        • 2017-12-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-17
        相关资源
        最近更新 更多