0

我正在创建简单的上传表单(用于 .zip 文件),我想验证 zip 是否包含以后需要的所有文件。

所以我有一个函数 isZipCorrect():

isZipCorrect  = function() {
  'use strict';
  if (this.name.slice(-3) === 'zip') {
    var fileReader = new FileReader();
    var zip = new JSZip();
    var shpCorrect = false;
    fileReader.onload = function() {
      var zip = new JSZip(this.result);
      shpCorrect = zip.file(/.*?/).every(function(file) {
          return (file.name.slice(-3) === 'shp' ||
          file.name.slice(-3) === 'dbf' ||
          file.name.slice(-3) === 'shx');
    });
    console.log(shpCorrect);
    };
    fileReader.readAsArrayBuffer(this.file);
    return shpCorrect;
  } else {
    return true;
  }

if(isZipCorrect())在 XMLHttpRequest 之前使用它。

我假设问题是异步函数(fileReader.onload),它在整个代码已经结束时结束操作。但我不想从 fileReader.onload 调用 send 函数,因为对我来说检查 Zip 是否正确必须是可选的(您应该能够上传其他无需“解析”即可通过的文件)

4

2 回答 2

0

您可以将回调函数作为参数传递给 isZipCorrect,在回调函数中您可以使用发送函数:

isZipCorrect  = function(callback) {
  'use strict';
  if (this.name.slice(-3) === 'zip') {
      // all the existing code
      fileReader.onload = function() {
           var zip = new JSZip(this.result);
           shpCorrect = zip.file(/.*?/).every(function(file) {
               callback((file.name.slice(-3) === 'shp' ||
                       file.name.slice(-3) === 'dbf' ||
                       file.name.slice(-3) === 'shx'));
      });    
  };
fileReader.readAsArrayBuffer(this.file);
//return shpCorrect;
} else {
   callback(true);
}
于 2016-04-01T15:41:59.410 回答
0

你可以使用jQuery.Deferred()来做这样的事情:

validateZipFile = function(file) {
  var 
    deferred = $.Deferred(),
    fileReader = new FileReader();

  fileReader.onload = function() {
    var zip = new JSZip(this.result);
    var isCorrect = zip.file(/.*?/).every(function(file) {
      return /\.(shp|dbf|shx)$/i.test(file.name)
    });

    isCorrect ? deferred.resolve() : deferred.reject();
  };

  if( !/\.(zip)$/i.test(file.name) ) {
    deferred.reject()
  } else {
    fileReader.readAsArrayBuffer(file)
  }

  return deferred.promise()
};

并这样称呼它:

validateZipFile(file).done(submitForm).fail(handleBadZip);

其中 'submitForm' 和 'handleBadZip' 是您之前定义的函数

于 2016-04-01T15:56:25.923 回答