【问题标题】:Check file type when form submit?提交表单时检查文件类型?
【发布时间】:2011-11-02 07:40:09
【问题描述】:

我的表单包含以下字段,

<form onsubmit="return checkcreateform()" action="/gallery/create" method="post" enctype="multipart/form-data">
   <label>Type:*</label>
    <label for="type-1">
     <input type="radio" checked="checked" value="1" id="type-1" name="type">Image
    </label>
   <br>
   <label for="type-2">
   <input type="radio" value="2" id="type-2" name="type">Video
   </label>  
   <label class="itemdetailfloatL required" for="file">File:*</label>
   <input type="hidden" id="MAX_FILE_SIZE" value="8388608" name="MAX_FILE_SIZE">
   <input type="file" tabindex="5" class="text-size text" id="file" name="file">
 <input type="submit" value="Create" id="submit" name="submit">
</form>

我想在提交表单之前进行验证。在这里我如何验证用户是选择类型为图片并上传视频还是选择类型为视频并上传图片?

我们可以通过 javascript 或 jquery 来实现。有什么快速的方法来验证吗?

请帮我解决这个问题。

【问题讨论】:

标签: javascript jquery html file-upload


【解决方案1】:

不要使用onsubmit,而是使用 jQuery 的提交处理程序,并使用一些 javascript 进行验证,如下所示:

function getExtension(filename) {
  var parts = filename.split('.');
  return parts[parts.length - 1];
}

function isImage(filename) {
  var ext = getExtension(filename);
  switch (ext.toLowerCase()) {
    case 'jpg':
    case 'gif':
    case 'bmp':
    case 'png':
      //etc
      return true;
  }
  return false;
}

function isVideo(filename) {
  var ext = getExtension(filename);
  switch (ext.toLowerCase()) {
    case 'm4v':
    case 'avi':
    case 'mpg':
    case 'mp4':
      // etc
      return true;
  }
  return false;
}

$(function() {
  $('form').submit(function() {
    function failValidation(msg) {
      alert(msg); // just an alert for now but you can spice this up later
      return false;
    }

    var file = $('#file');
    var imageChosen = $('#type-1').is(':checked');
    if (imageChosen && !isImage(file.val())) {
      return failValidation('Please select a valid image');
    } else if (!imageChosen && !isVideo(file.val())) {
      return failValidation('Please select a valid video file.');
    }

    // success at this point
    // indicate success with alert for now
    alert('Valid file! Here is where you would return true to allow the form to submit normally.');
    return false; // prevent form submitting anyway - remove this in your environment
  });

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form action="/gallery/create" method="post" enctype="multipart/form-data">
  <label>Type:*</label>
  <label for="type-1">
     <input type="radio" checked="checked" value="1" id="type-1" name="type">Image
    </label>
  <label for="type-2">
   <input type="radio" value="2" id="type-2" name="type">Video
    </label> <br />
  <label class="itemdetailfloatL required" for="file">File:*</label>
  <input type="hidden" id="MAX_FILE_SIZE" value="8388608" name="MAX_FILE_SIZE">
  <input type="file" tabindex="5" class="text-size text" id="file" name="file">
  <br/>
  <input type="submit" value="Create" id="submit" name="submit">
</form>

在 IE8、RockMelt(基于 Chrome)和 Firefox 7 中测试:http://jsfiddle.net/Ngrbj/4/

【讨论】:

  • 用户可以轻松将文件扩展名更改为“傻瓜”这样的验证,基于mimetype的解决方案会更好(不过,我不确定是否存在,仍在寻找它自己)跨度>
  • getExtension 可以是一行,方法是“return filename.split('.').pop();”
  • 可以轻松更改文件扩展名并通过此
  • @Kakar 正确。这不是万无一失的。此答案是在访问 File API 以读取文件内容之前编写的(如果您必须支持旧浏览器,这仍然不是一个选项)。无论您使用什么 JS 解决方案,您仍然希望在服务器上对其进行验证。没有客户端验证可以取代服务器端验证。
【解决方案2】:

每个文件类型都有一个“type”属性,例如:“image/jpeg”、“audio/mp3”等等……

这是使用“匹配”方法(字符串)检查文件类型的一种方法的示例:

function getFileType(file) {

  if(file.type.match('image.*'))
    return 'image';

  if(file.type.match('video.*'))
    return 'video';

  if(file.type.match('audio.*'))
    return 'audio';

  // etc...

  return 'other';
}

你也可以用布尔方式写:

function isImage(

  return !!file.type.match('image.*');

}

【讨论】:

  • 您能否添加信息以帮助原始发布者知道在哪里挂钩您的函数,以及在哪里定义它?
  • 谢谢,我认为这是最简单的方法。
【解决方案3】:

提供的答案有效,但使用 javascript 数组函数,验证代码行数更少,运行速度更快:

var extensionLists = {}; //Create an object for all extension lists
extensionLists.video = ['m4v', 'avi','mpg','mp4', 'webm'];  
extensionLists.image = ['jpg', 'gif', 'bmp', 'png'];

// One validation function for all file types    
function isValidFileType(fName, fType) {
    return extensionLists[fType].indexOf(fName.split('.').pop()) > -1;
}

然后,提交代码中的 if 语句就换成了:

if (imageChosen && !isValidFileType(file.val(), 'image')) {
        return failValidation('Please select a valid image');
    }
else if (!imageChosen && !isValidFileType(file.val(), 'video')) {
        return failValidation('Please select a valid video file.');
    }        

【讨论】:

    【解决方案4】:

    在 input:file 上使用 files 属性,您可以遍历文件对象并检查类型属性

        $('#upload').on("change", function(){
     
             var  sel_files  = document.getElementById('upload').files;
             var len = sel_files.length;
     
             for (var i = 0; i < len; i++) {
    
                var file = sel_files[i];
             
                if (!(file.type==='application/pdf')) {
                continue;
                }
              }
    
          }); 
    <div class="modal">
      <form id="form-upload">
        <input type="file" name="upload" id="upload" multiple>
        <br/>
         
    </form>
    </div>

    【讨论】:

      【解决方案5】:

      如前所述,文件具有类型属性。 您可以将文件类型与支持的类型列表进行比较,如下所示:

      const validFileTypes = ['image/jpeg', 'image/jpg', 'image/png'];
      
      const fileTypeValid = (file, fileTypes) => {     
          return fileTypes.some((fileType) => fileType === file.type);
      }
      
      // ... call fileTypeValid with the two parameters
      

      【讨论】:

        【解决方案6】:

        你可以试试这个:

        function getFile(fieldId) {
            var fileInsert = document.getElementById(fieldId).value;
                fileName = fileName.split('/');
                fileName = fileName[fileName.length];
                extentions = fileName.split('.');
                extentions = extentions[extentions.length];
            return extentions;
        }
        

        您可以在checkcreateform()中使用此功能

        【讨论】:

          【解决方案7】:

          首先你应该像这样改变你的html:

          <input type="file" tabindex="5" class="text-size text" id="file" name="file" onchange="checkeExtension(this.value,"submit");">
          

          那么,你需要一个这样的函数:

          ///image 1 and video 2
          //you can extend file types
          var types= {
              'jpg' :"1",
              'avi' :"2",
              'png' :"1",
              "mov" : "2",
          }
          
          function checkeExtension(filename,submitId) {
              var re = /\..+$/;
              var ext = filename.match(re);
              var type = $("input[type='radio']:checked").val();
              var submitEl = document.getElementById(submitId);
          
              if (types[ext] == type) {
                  submitEl.disabled = false;
                  return true;
              } else {
                  alert("Invalid file type, please select another file");
                  submitEl.disabled = true;
                  return false;
              }  
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-31
            • 1970-01-01
            • 1970-01-01
            • 2022-11-24
            • 2019-03-21
            • 2015-12-13
            • 2019-04-30
            • 2017-05-20
            相关资源
            最近更新 更多