После масштабирования и раскрашивания JPG с помощью Sharp я сразу же удаляю входной файл. Когда я загружаю новый файл с тем же именем, Sharp выводит старый файл. Я использую NodeJS на Ubuntu 16.04.
Вот код для редактирования файла:
sampleFile.mv(__dirname + "/" + name + "." + ext, function(err) {
if (err)
return res.status(500).send(err);
res.send('File uploaded!');
if (ext != "xlsx") {
// This will attempt to resize the images
console.info("Sharpening image")
sharp(__dirname + "/" + name + "." + ext).resize({ height: 27 }).flatten( { background: '#ffffff' } ).toFile("/var/www/my_ip/file.jpg")
.then(function(newFileInfo) {
// newFileInfo holds the output file properties
console.info("Success")
try {
fileSystem.unlinkSync(__dirname + "/" + name + "." + ext)
//file removed
} catch(err) {
console.error(err)
}
})
.catch(function(err) {
console.info("Error occured with file " + name + "." + ext + " | Dir: " + __dirname);
console.info(err)
try {
fileSystem.unlinkSync(__dirname + "/" + name + "." + ext)
//file removed
} catch(err) {
console.error(err)
}
//})
}); //this line errored
}
});
При первом запуске он работает так, как задумано, однако, если файл, который я использую для второго запуска, имеет то же имя, что и исходный файл, он каким-то образом запомнит старый файл и вместо этого выведет его. Я не уверен, как он запоминает этот файл, так как я сразу же удаляю его. Есть какие нибудь идеи как это починить?
Обновлено: чтобы убедиться, что проблема не связана с тем, что первый файл не был правильно удален, я провел быстрый тест. Во-первых, я использую сервер для редактирования 1 файла и получаю этот отредактированный файл в качестве вывода, как и ожидалось. Теперь, вместо того, чтобы снова редактировать новый файл с тем же именем, я перезапустил сервер, затем отредактировал новый файл с тем же именем. Теперь он правильно выводит новый файл. Я считаю, что у NPM должен быть какой-то кеш, о котором я не знаю, в настоящее время читаю документы, чтобы убедиться, что моя теория верна.
Да, моя теория была верна! У Sharp есть кеш, и по какой-то причине ранее отредактированные файлы остаются открытыми. Вероятно, это хорошо для оптимизации, но если у вас те же проблемы, что и у меня, и вы не беспокоитесь об оптимизации, вы можете включить кеш следующим образом:
sharp.cache(false);
Я потерял один день, пытаясь понять, почему мой ввод в клиенте отправлял другой файл, но на сервере продолжал получать один и тот же файл снова и снова! И обнаружил, что это была проблема на моем сервере node API, и, наконец, что он Sharp кэширует его по умолчанию!