Я строю веб-скребок в NodeJs.Среди других возможностей, он может загружать файлы (изображения и другие).Я поместил код, который занимается загрузкой, в отдельный модуль.
Я скоро понял, что иногда URL-адрес файла не заканчивается фактическим расширением.Это проблема, потому что мне нужно знать это перед записью на диск.
Что я сделал, так это полагался на расширение «если оно существует» и полагался на заголовок типа содержимого(который не всегда существует, и формат которого несовместим), если это не так.
Вот код, который имеет дело с определением имени файла:
getFileName() {
const extension = path.extname(this.url)//Gets the url.
const extensionWithoutDot = extension.substr(1);
//Checks if the extension length makes sense. Pure hack..I did it because some "extensions" might not be an actual one.
const urlEndsWithValidExtension =extensionWithoutDot.length >=2 && extensionWithoutDot.length <=4 ? true : false;
const baseName = path.basename(this.url);
console.log('extension', path.extname(this.url))
let fileName = "";
if (urlEndsWithValidExtension) {//If it makes sense, i treat it normally.
fileName = sanitize(baseName);
}
else {//If not, i rely on the content type.
var contentType = this.response.headers['content-type'];
const extension = contentType.split("/")[1];
fileName = `${sanitize(baseName)}.${extension}`;
}
const fileProcessor = new FileProcessor({ fileName, path: this.dest });
if (this.clone) {
fileName = fileProcessor.getAvailableFileName();
}
return fileName;
}
Этот кодимеет дело с определением имени файла, до того, как начнется фактический поток (или до того, как массив-буфер будет записан на диск).
Из опыта, который я получил, "поигрывая" со многими различными сайтами, я узнал,что я могу ожидать различные "сюрпризы".Этот код обрабатывает большинство из них, но, очевидно, не все.
Есть ли надежный, не хакерский способ получить расширение real ?Также подойдет любой подходящий модуль NPM (не удалось его найти).