@arco-design/web-react
Version:
Arco Design React UI Library.
121 lines (120 loc) • 4.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.loopDirectory = exports.getFiles = exports.isAcceptFile = void 0;
var is_1 = require("../_util/is");
var isAcceptFile = function (file, propsAccept) {
var accept = (0, is_1.isObject)(propsAccept) ? propsAccept === null || propsAccept === void 0 ? void 0 : propsAccept.type : propsAccept;
// 显示设置 strict=false,才是非严格模式,不走过滤逻辑
var strict = !((0, is_1.isObject)(propsAccept) && propsAccept.strict === false);
if (strict && accept && file) {
var accepts = (0, is_1.isArray)(accept)
? accept
: accept
.split(',')
.map(function (x) { return x.trim(); })
.filter(function (x) { return x; });
var fileExtension_1 = (file.name.indexOf('.') > -1 ? "." + file.name.split('.').pop() : '').toLowerCase();
return accepts.some(function (type) {
var typeText = type && type.toLowerCase();
var fileType = (file.type || '').toLowerCase();
var baseFileType = fileType.split('/')[0]; // audio/mpeg => audio;
// `${baseFileType}/${fileExtension}` === typeText
// filetype is audio/mpeg, but accept is audio/mp3, should return true
if (typeText === fileType ||
"" + baseFileType + fileExtension_1.replace('.', '/') === typeText) {
// 类似excel文件这种
// 比如application/vnd.ms-excel和application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
// 本身就带有.字符的,不能走下面的.jpg等文件扩展名判断处理
// 所以优先对比input的accept类型和文件对象的type值
return true;
}
// */*,* 之类的所有类型
if (/^\*(\/\*)?$/.test(typeText)) {
return true;
}
if (/\/\*/.test(typeText)) {
// image/* 这种通配的形式处理
return fileType.replace(/\/.*$/, '') === typeText.replace(/\/.*$/, '');
}
if (/\..*/.test(typeText)) {
// .jpg 等后缀名
var suffixList = [typeText];
// accept=".jpg", jpeg后缀类型同样可以上传,反之亦然
if (typeText === '.jpg' || typeText === '.jpeg') {
suffixList = ['.jpg', '.jpeg'];
}
return suffixList.indexOf(fileExtension_1) > -1;
}
return false;
});
}
return !!file;
};
exports.isAcceptFile = isAcceptFile;
var getFiles = function (fileList, accept) {
if (!fileList) {
return;
}
var files = [].slice.call(fileList);
if (accept) {
files = files.filter(function (file) {
return (0, exports.isAcceptFile)(file, accept);
});
}
return files;
};
exports.getFiles = getFiles;
var loopDirectory = function (items, accept, callback) {
var files = [];
var restFileCount = 0; // 剩余上传文件的数量
var onFinish = function () {
!restFileCount && callback(files);
};
var _loopDirectory = function (item) {
restFileCount += 1;
if (item === null || item === void 0 ? void 0 : item.isFile) {
item.file(function (file) {
restFileCount -= 1;
if ((0, exports.isAcceptFile)(file, accept)) {
Object.defineProperty(file, 'webkitRelativePath', {
value: item.fullPath.replace(/^\//, ''),
});
files.push(file);
}
onFinish();
});
return;
}
if (item === null || item === void 0 ? void 0 : item.isDirectory) {
// item 是个文件夹
var reader_1 = item.createReader();
var flag_1 = false;
var readEntries_1 = function () {
reader_1.readEntries(function (entries) {
if (!flag_1) {
restFileCount -= 1;
flag_1 = true;
}
if (entries.length === 0) {
onFinish();
}
else {
readEntries_1(); // the maximum files read using readEntries is 100
entries.forEach(_loopDirectory);
}
});
};
readEntries_1();
return;
}
restFileCount -= 1;
onFinish();
};
var list = [].slice.call(items);
list.forEach(function (item) {
if (item.webkitGetAsEntry) {
_loopDirectory(item.webkitGetAsEntry());
}
});
};
exports.loopDirectory = loopDirectory;