Как передать загруженное изображение в Jimp с помощью Hapi 19?
Мы обновляем наш интерфейс и достигли довольно старого фрагмента кода, который позволяет нам загружать файл изображения в серверную часть для использования в качестве аватара.
После недолгих споров нам удалось уговорить Vue.js
интерфейс для передачи изображения в серверную часть через FormData
.
Проблема в том, что обработчик должен использовать Jimp
для изменения размера изображения и размещения копий в определенных каталогах. К сожалению, изображения с измененным размером имеют нулевое значение.
Наш маршрут загрузки
module.exports = {
name: 'Upload Routes',
register: async (server, options) => {
server.route([
{
method: 'PUT',
path: '/uploads/user/{md_ref}/image',
handler: handleUpload,
options: {
payload: {
allow: 'multipart/form-data',
maxBytes: 209715200,
multipart: true,
output: 'file',
uploads: './src/public/images/uploads',
parse: true
}
}
}
])
}
}
И обработчик
async function handleUpload (req, h) {
try {
const path400 = './src/public/images/400/'
const path200 = './src/public/images/200/'
const path100 = './src/public/images/100/'
const payload = req.payload
const newImage = await Jimp.read(payload.file.path)
await newImage.write(`${path400}${payload.file.filename}`)
await newImage.write(`${path200}${payload.file.filename}`)
await newImage.write(`${path100}${payload.file.filename}`)
...
Мы знаем, что изображение правильно загружается в ./src/public/images/uploads
- если мы переименуем его обратно в filename.jpg
тогда у нас есть дубликат оригинала.
Jimp
кажется, читает новое изображение из payload.file.path
как мы можем проверить newImage
и увидеть правильные размеры и т. д. Однако пока write()
функция создает новые файлы в правильных каталогах, все они равны 0 байтам.
Есть идеи?
1 ответ
Получается, что Jimp
был обновлен с момента написания back-end (не удивительно)
Решение - использовать .writeAsync()
когда используешь await
и нет .write()
Таким образом, приведенный выше код (сокращенно для одной записи) должен быть
const path400 = './src/public/images/400/'
const payload = req.payload
const newImage = await Jimp.read(`${payload.file.path})
await newImage.writeAsync(`${path400}${payload.file.filename}`)