Я создал обещание разрешить тип файла при загрузке файла.
const fileTypeChecker = file => new Promise((resolve) => {
const fileReader = new FileReader()
fileReader.onloadend = (e) => {
const arr = (new Uint8Array(e.target.result)).subarray(0, 4)
let header = ''
let type = null
for (let i = 0; i < arr.length; i++) {
header += arr[i].toString(16)
}
switch (header) {
case '89504e47': // png
case 'ffd8ffe0': // following are jpeg magic numbers
case 'ffd8ffe1':
case 'ffd8ffe2':
case 'ffd8ffe3':
case 'ffd8ffe8':
type = 'IMG'
break
case 'd0cf11e0': // xls
case '504b34': // xlsx
type = 'XLS'
break
case '25504446':
type = 'PDF'
break
default:
type = 'unknown' // Or you can use the blob.type as fallback
break
}
resolve(type)
}
fileReader.readAsArrayBuffer(file.slice(0, 4))
})
Я использую реагирующую дропзону для удаления файлов. Функция onDrop
определяется как
onDrop = async (accepted, rejected) => {
const file = accepted[0] || rejected[0]
const fileType = await fileTypeChecker(file)
let error = ''
if (fileType === 'XLS') {
this.setState({
bulkUpload: {
files: file
}
})
} else {
error = 'Please select a valid XLS file'
}
if (error) {
this.setState({
error
})
}
}
Почему магический номер файла 504b34 для файлов .xlsx и .zip?
Так что даже если я загружаю zip-файл, это рассматривается как XLS.