Рубрики
Без рубрики

Почему я построил Downldr

Читайте дальше, чтобы понять, почему в Node.js нужен новый пакет загрузки в Node.js

Автор оригинала: 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, таким образом мы избегаем создания пустого файла!

Вы можете проверить Документация Для получения дополнительных вариантов и расширенного использования!