0

我们正在升级我们的前端,并且已经达到了一段相当旧的代码,它允许我们将图像文件上传到后端以用作头像。

经过一番争论,我们设法说服Vue.js前端通过FormData.

问题是处理程序应该用于Jimp调整图像大小并将副本放置在特定目录中。不幸的是,调整大小的图像是 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并查看正确的尺寸等。但是,虽然该write()函数在正确的目录中创建新文件,但它们都是 0 字节。

有任何想法吗?

4

1 回答 1

0

所以事实证明,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}`)
于 2020-04-08T09:30:06.903 回答