Автор оригинала: Marcos Casagrande.
Проблема, которую я хотел решить
Я хотел, чтобы загрузить файл, который проверил, что загруженный файл был тип файла, который я хотел загрузить, чтобы избежать сохранения недопустимых файлов. фактический Тип файла, а не то, что Content-Type
Заголовок говорит!
В любом случае, я не нашел пакета, которая позволила фильтрации, даже с Content-Type
Заголовок, поэтому я решил построить один!
Если вы знаете, пожалуйста, оставьте комментарий с именем пакета.
Что такое downldr?
Это файловая загрузка, что позволяет фильтрацию типа файлов и условного трубопровода, поэтому, если загруженный файл неверный, или запрос не удается, вы не заканчиваете пустой файл.
Где я могу получить это?
Вы можете получить это от NPM
npm install downldr
Как работает фильтрация
Используя расширение или Content-Type
Заголовок для обнаружения типа файла не является доказательством пули, поскольку заголовок может быть установлен на любое значение, и обычно по умолчанию к типу обнаружено расширением, и если удлинение не хватает, он может прийти как Приложение/октет-поток
Мы все знаем, что мы можем сделать следующее:
mv video.mp4 image.jpg
Теперь у нас есть видео, с JPG
Расширение, но это видео в конце.
Таким образом, если бы мы высказали этот файл, чтобы позже использовать его в своем приложении, у нас были бы неожиданные результаты.
downldr('https://example.com/image.jpg') .pipe(fs.createWriteStream(path.join(__dirname, 'images', 'image.jpg'));
К счастью для нас Downldr
поставляется с Фильтр
Опция, что позволяет нам фильтровать, какие файлы мы хотим скачать, и он не использует Content-Type
Ни расширение, чтобы обнаружить его Отказ
Большинство файлов имеют подпись, которая позволяет нам идентифицировать или проверить контент. Эта подпись часто называют волшебными номерами или волшебными байтами. Downldr
использует Тип файла
Пакет под капотом, чтобы предоставить эту функциональность.
Но если вы хотите реализовать его самостоятельно, для конкретного типа файла не так уж сложно сделать.
Например, Hex Signature для PNG
Файл: 89 50 4E 47 0D 0A 1A 0A
В Node.js, что переводит: Буфер. Из ([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
Таким образом, код для реализации детектора PNG, заключается в следующем:
function isPNG(buffer) { const magicBytes = Buffer.from([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]); return buffer.indexOf(magicBytes) === 0; } fs.createReadStream('image.png') // an actual png :) .once('data', chunk => { console.log(`png: ${isPNG(chunk)}`); // png: true }); fs.readFile('image.jpg', (err, content) => { console.log(`png: ${isPNG(chunk)}`); // png: false });
Обратите внимание, что нам нужны только несколько байтов, поэтому отправка первого куска потока достаточно!
Теперь давайте посмотрим, как выполняется фильтрация файлов в Downldr
Отказ
downldr('https://example.com/image.jpg', { filter: (type, chunk, statusCode) => { // type.mime may be undefined for some files console.log(type.contentType); // image/jpg console.log(type.mime); // video/mp4 return type.mime === 'image/jpeg'; }, // For the above filtering, it will be out.jpg target: (ext) => fs.createWriteStream(`out.${ext}`) }) // Error: Invalid type: video/mp4 - Status Code: 200 .on('error', console.error) .on('complete', () => console.log('done!'));
При использовании цель
вариант вместо .pipe
Работает как условная труба. Он только создает файл поток, как только Фильтр
Функция возвращает True, таким образом мы избегаем создания пустого файла!
Вы можете проверить Документация Для получения дополнительных вариантов и расширенного использования!