我有回家的路线。在这个主路由中,我使用Jimp库来处理图像,调整它的大小,然后更改质量,最后将图像保存在目录中,但我想下载图像,以便用户可以在他的机器上下载。但它没有下载。我正确地保存在名为output.jpg的目录中。这是密码
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)//设置JPEG quality.greyscale()//设置greyscale.write('output.jpg');//保存
Res.Download(“output.jpg”);});
当尝试重现您的错误时,我在向节点服务器发送请求时在浏览器中下载了一个jpg文件,但这个文件似乎有问题。原因是jimp.write()是一个异步函数,因此
res.download('output.jpg')
在jimp.write()将文件写入磁盘之前执行。要在文件完全写入磁盘后发送文件,您有两个使用jimp.write的选项,这里提供了文档
下面是我的快速代码来重现和修复这个问题
使用带有回调的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')完成并解析返回的承诺