在 Jimp 处理图像后下载图像文件

Posted

技术标签:

【中文标题】在 Jimp 处理图像后下载图像文件【英文标题】:Download Image File after Jimp Processed the Image 【发布时间】:2020-01-16 08:44:38 【问题描述】:

我有这条回家路线。在这条主路径中,我使用 Jimp 库处理图像调整大小,然后更改质量,最后将图像保存在目录中,但我想下载图像,以便用户可以将其下载到他的机器上。但它没有下载。我正确地保存在名为 output.jpg 的目录中。这是代码

app.get("/", (req, res) =>

res.type('jpg'); res.attachment('output.jpg')

jimp.read('lenna.png', (err, lenna) => if (err) 抛出错误; 莲娜 .resize(256, 256) // 调整大小 .quality(60) // 设置 JPEG 质量 .greyscale() // 设置灰度 .write('output.jpg'); // 保存

res.download('output.jpg'); );

【问题讨论】:

【参考方案1】:

当尝试重现您的错误时,我在向节点服务器发送请求时在浏览器中下载了一个 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') 完成并解析返回的承诺

【讨论】:

以上是关于在 Jimp 处理图像后下载图像文件的主要内容,如果未能解决你的问题,请参考以下文章

Jimp 错误:未找到匹配的构造函数重载

Rails + CarrierwaveDirect:成功直接上传到S3后无法下载和处理图像

.NET 图像处理程序在下载时剥离文件类型

预处理后将多目录图像保存在单个文件中

将处理后的图像数组保存在文件夹中

简单二次封装的Golang图像处理库:图片裁剪