【问题标题】:Jquery file upload plugin: how to validate files on add?Jquery 文件上传插件:如何在添加时验证文件?
【发布时间】:2013-03-21 13:35:39
【问题描述】:
$('#fileupload')
    .fileupload({
        acceptFileTypes: /(\.|\/)(jpg)$/i
    })
    .on('fileuploadadd', function (e, data) {
        console.log(data.files.valid); //undefined
        setTimeout(function () {
            console.log(data.files.valid); //true or false
        }, 500);
    })
;

jsFiddle

如何在不超时的情况下获取属性data.files.valid 的布尔值?

【问题讨论】:

    标签: jquery blueimp jquery-file-upload


    【解决方案1】:

    我需要使用当前版本的插件 (5.39.1) 进行验证,这对我有用:

    请务必按此顺序包含jquery.fileupload-process.jsjquery.fileupload-validate.js 之后 jquery.fileupload.js之前您的初始化脚本。

    在您的初始化脚本中添加验证选项并在fileuploadprocessalways 回调中检查验证:

    $('.fileinput').fileupload({
        // The regular expression for allowed file types, matches
        // against either file type or file name:
        acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
        // The maximum allowed file size in bytes:
        maxFileSize: 10000000, // 10 MB
        // The minimum allowed file size in bytes:
        minFileSize: undefined, // No minimal file size
        // The limit of files to be uploaded:
        maxNumberOfFiles: 10
      }).on('fileuploadprocessalways', function (e, data) {
        var currentFile = data.files[data.index];
        if (data.files.error && currentFile.error) {
          // there was an error, do something about it
          console.log(currentFile.error);
        }
      });
    

    所有验证都是可选的,只是不要留下你不需要的那些undefined

    【讨论】:

    • 绑定fileuploadprocessfail 也可以。
    • 谢谢!无法让验证/处理工作,并且即将编写一些疯狂的自定义验证(正如我所看到的其他人所做的那样)。但这就像包含适当的必需文件一样简单。
    【解决方案2】:

    这是你想要做的:

    $('#fileupload')
        .fileupload({
            acceptFileTypes: /(\.|\/)(jpg)$/i
        })
        .bind('fileuploadadded', function (e, data) {
            console.log(data.files.valid);
        });
    

    核心 jquery.fileupload.js 文件正在添加您的文件并触发“fileuploadadd”事件,但这是在文件验证之前

    文件 jquery.fileupload-ui.js 正在添加文件后进行验证,并在完成后触发另一个“fileuploadadded”事件。

    更改事件,一切就绪。

    请注意:

    此答案在 2013 年 3 月发布时有效且有效。从那时起,这个上传插件似乎发生了变化。这意味着有一个新问题,您应该发布一个新问题(或搜索以查看是否有人已经有),而不是投反对票!

    【讨论】:

    • 你的小提琴不工作!如果我尝试在“fileuploadadded”回调中访问 data.files.valid,我会得到未定义...
    • 小提琴不起作用,因为包含的 js 文件在它们加载的路径中不再可用 (404)。如果设置正确,这仍然不适用于当前版本,但可能曾经这样做过。
    • 当我发布这个答案时它确实有效。如果它不再适用于这个插件的最新版本,那么就会出现一个新问题。请发布一个新问题,不要对这个答案投反对票。
    • 返回undefined :(
    【解决方案3】:

    这就是我所做的,它适用于我的新版本: 我为每种类型的文件及其大小创建了一个验证。

    $("#fileUploadArea").fileupload({
            dataType: 'json',
            url:'${upload}',
            multiple:true,
            autoSubmit:false,
            maxNumberOfFiles: Number('${quantidadeMaximaArquivosUpload}'),
            dynamicFormData: function()
            {
                var data ={ 
                        idEntidadeEmpresarial: $('#idEntidadeEmpresarial').val(),
                        idDominioFamilia: $('#idDominioFamilia').val(),
                        idSubgrupo: $('select[id^="subgrupo_').map(function(){return $(this).val();}).get(),
                        descricao: $('#descricao').val(),
                        validade: $('#validade').val()
                }
                return data;
            },
            headers: {
                Accept: "application/json"
            },
            accept: 'application/json',        
            imageMaxWidth: 800,
            imageMaxHeight: 800,
            imageCrop: true ,
            stop: function(){
                $.unblockUI();
                if($('#fechar').is(":checked")){
                    window.close();
                }else{
                    $('select[id^="subgrupo_').each(function(){
                        $(this).val('');
                        $(this).trigger("chosen:updated");
                    })
                    $('#validade').val('');
                    $('#descricao').val('');
                    $('#sucesso').html('');
                    $('#sucesso').append('<p><spring:message code="upload.sucesso"/>');
                    $('#sucesso').show();
                }
            },
            error: function(files,status,errMsg)
            {
                $('#erro').html('');
                $('#erro').append('<p>'+errMsg+'</p>');
                $('#erro').show();
            },
            acceptFileTypes : ${listaExtensaoPermitidas}
        }).on('fileuploadprocessalways', function (e, data) {
            var currentFile = data.files[data.index];
    
            var tamanho = currentFile.size;
            var extensao = currentFile.name.substring(currentFile.name.lastIndexOf(".") +1,currentFile.name.length);            
    
            if(hashExtensao.get(extensao.toUpperCase()) < tamanho){
                alert("file type max size "+hashExtensao.get(extensao.toUpperCase());
                data.abort();
            }
    
        });
    

    【讨论】:

      【解决方案4】:

      我认为可以使用 add 方法。

          var fileUploadInit = function() {
          $("#file-upload-form").fileupload({
              dataType: "json",
              url: url,
              add: function (e, data){
                  if(validatefunction(data)){
                      data.submit();
                  } else {
                      return false;
                  }
              },
              progressall: function (e, data) {
                  var progress = parseInt(data.loaded / data.total * 100, 10);
                  $('#upload-progress').css('width',progress + '%');
              },
              done: function(e, data) {
                  debugger
              },
              processfail: function(e, data){
                  debugger
              }
      
          })
      }
      var validatefunction = function(data){
          // Do validation here. Return true if everything is correct else return                 false
      }
      

      【讨论】:

        【解决方案5】:

        这是您想要对较新版本的插件 (9.11.2) 执行的操作: 包括此文件:
        - jquery.ui.widget.js
        - jquery.iframe-transport.js
        - jquery.fileupload.js
        - jquery.fileupload-process.js
        - jquery.fileupload-validate.js

        $('#fileupload')
        .fileupload({
            acceptFileTypes: /(\.|\/)(jpg)$/i
        })
        .on('fileuploadadd', function (e, data) {
            console.log('validation object not available at this point. Do not do submit here');
        })
        .on('fileuploadprocessalways', function (e, data) {
            console.log(data.files.error);//true if error
            console.log(data.files[0].error);//error message
            if(!data.files.error) data.submit(); //do submission here
        });
        

        【讨论】:

        • 不确定自发布此评论后是否有其他更新,但最新版本 (9.11.2) 再次需要不同的方法来实现验证: - 添加前面提到的两个文件:1 ) jquery.fileupload-process.js 2) jquery.fileupload-validate.js 添加 jquery.fileupload.js 之后 - 将验证配置添加为 processQueue 例如:processQueue: [{ action: 'validate', acceptFileTypes: '..' }, { action: 'validate', maxFileSize: '..' }]
        • 抱歉最新版本。我已经编辑了我的帖子以澄清它。
        • 奇怪的是,当我添加 processQueue 时,即使使用 [] 值,我的调整大小也不再触发......而验证开始使用这个。我不想工作。 ://
        【解决方案6】:

        嗯,@jszbody 的答案是完美的答案。

        但是,如果有人来到这里寻找类似问题的解决方案,用户想知道文件是否添加不正确。

        blueimp jquery-file-upload Doesn't throw error on unsuccessful add

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-02
          • 1970-01-01
          • 2011-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-06
          • 1970-01-01
          相关资源
          最近更新 更多