В прошлый раз я просил помощи почти с той же проблемой. У меня есть веб-приложение, в котором пользователь загружает изображение, а затем оно должно быть сжато.
Итак, моя проблема в том, что я не понимаю, как сжимать загруженное изображение и показывать его на следующей странице.
Мой запрос на загрузку :
router.post('/upload', (request, response) => {
upload(request, response, (error) => {
if(error) {
request.flash('error_message', 'Only images are allowed')
response.redirect('/')
}
else {
if(request.file == undefined) {
request.flash('error_message', 'Image file was not been selected.')
response.redirect('/')
console.log(request.file)
}
else {
request.flash('success_message', 'Image was uploaded successfully.')
response.redirect(`/${request.file.filename}`);
console.log(request.file)
}
}
})
})
После загрузки изображение отображается на следующей странице с помощью параметра get:
router.get('/:filename', (request, response) => {
let fileName = request.params.filename
let pathToCheck = path.join(__dirname, '../public/uploads/' + fileName)
if (fs.existsSync(pathToCheck)) {
let imageDestination = `${request.protocol}://${request.headers.host}/uploads/${fileNam e}`;
response.render('compress', {
userImage: imageDestination
})
var bitmap = imageBase64(pathToCheck);
const encode = RLE.Encode(bitmap)
Vibrant.from(pathToCheck).getPalette()
.then(palette => {
console.log(palette)
})
}
else {
response.send('Oops.')
}
})
И теперь мне нужно сжать это изображение. Я хочу использовать imagemin с другими его плагинами сжатия. Но как мне сделать на нем изображение или ссылку?
router.post('/result/:filename', async (request, response) => {
const compressedImage = await imagemin(['uploads/' + request.params.filename], {
destination: 'compressed',
plugins: [
imageminMozjpeg(),
imageminJpegtran(),
imageminPngquant(),
imageminOptipng(),
imageminGiflossy(),
imageminGifsicle(),
imageminSvgo(),
imageminWebp()
]
})
response.redirect('/result')
})