Как передать загруженное изображение в Jimp с помощью Hapi 19? - PullRequest
0 голосов
/ 07 апреля 2020

Мы модернизируем наш интерфейс и достигли довольно старого кода, который позволяет нам загружать файл изображения на сервер для использования в качестве аватара.

После некоторых споров мы удалось убедить интерфейс 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 байт.

Есть идеи?

1 Ответ

0 голосов
/ 08 апреля 2020

Получается, что Jimp было обновлено с тех пор, как был написан бэкэнд (не удивительно)

Решение состоит в том, чтобы использовать .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}`)
...