Мы модернизируем наш интерфейс и достигли довольно старого кода, который позволяет нам загружать файл изображения на сервер для использования в качестве аватара.
После некоторых споров мы удалось убедить интерфейс Vue.js
передать изображение на сервер с помощью FormData
.
Проблема заключается в том, что обработчик должен использовать Jimp
для изменения размера изображения и размещения копии в указанных c каталогах. К сожалению, изображения с измененным размером имеют размер 0 байт.
Наш маршрут загрузки
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
появляется для чтения newImage из payload.file.path
, поскольку мы можем проверить newImage
и увидеть правильное размеры эт c. Однако, хотя функция write()
создает новые файлы в c правильных каталогах, все они имеют размер 0 байт.
Есть идеи?