当尝试重现您的错误时,我在向节点服务器发送请求时在浏览器中下载了一个 jpg 文件,但该文件似乎有问题。
原因是 jimp.write() 是一个异步函数,因此
res.download('output.jpg')
在 jimp.write() 完成将文件写入磁盘之前执行。
要在文件完全写入磁盘后发送文件,您有两个使用 jimp.write 的选项,记录在 here
这是我重现和修复问题的快速代码
将 jimp.write 与回调一起使用
const express = require('express')
const app = express()
var jimp = require('jimp');
app.get("/", (req, res) => {
res.type('jpg');
res.attachment('output.jpg');
jimp.read('lenna.png', (err, lenna) => {
if (err) throw err;
lenna.resize(256, 256) // resize
.quality(60) // set JPEG quality
.greyscale() // set greyscale
.write('output.jpg', res.download('output.jpg')); // save
});
});
app.listen(3000);
重要的一点是将你的 res.download() 放在 jimp.write() 的回调中,当 jimp 完成将文件写入磁盘时执行。
.write('output.jpg', res.download('output.jpg')); // save
使用 jimp.writeAsync 返回一个承诺
const express = require('express')
const app = express()
var jimp = require('jimp');
app.get("/", (req, res) => {
res.type('jpg');
res.attachment('output.jpg');
jimp.read('lenna.png', async (err, lenna) => {
if (err) throw err;
await lenna.resize(256, 256) // resize
.quality(60) // set JPEG quality
.greyscale() // set greyscale
.writeAsync('output.jpg'); // save
res.download('output.jpg');
});
});
app.listen(3000);
使用 async 并等待直到 lenna.(...).writeAsync('output.jpg') 完成并解析返回的承诺