Node保存Canvas图片并删除过期图片的操作步骤

 更新时间:2025年05月07日 09:43:07   作者:Jimmy  
本文,我们将探讨,如何使用 Canvas 生成图片,并通过 Node 将其保存在我们电脑的指定的位置,并在图片文件过期之后,删除该文件内容,以免占用我们的电脑存储空间,下面小编给大家详细演示一下操作步骤,需要的朋友可以参考下

引言

本文,我们将探讨,如何使用 Canvas 生成图片,并通过 Node 将其保存在我们电脑的指定的位置。并在图片文件过期之后,删除该文件内容,以免占用我们的电脑存储空间。

我们将使用的演示环境如下:

  • NodeJs
  • Ejs 模版
  • macOS Sequoia 15.0

canvas 合成

我们通过 toDataURL 生成一张图。

<canvas id="canvas" width="400" height="400"></canvas>
// 获取花布
const canvas = document.getElementById("canvas");
// 获取画笔
const context = canvas.getContext("2d");

// 简单绘制点什么
context.fillStyle = "#FFFF00";
context.fillRect(0, 0, 400, 400);

// other content ...
const dataUrl = canvas.toDataURL("image/png");

这里我们生成了 base64 的图片数据。

按照网页的下载方法,我们接下来的下载文件可以通过下面的方法来操作:

// 创建下载链接
const link = document.createElement("a");
link.href = dataUrl;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);

网页下载的位置因为安全策略,我们只能默认下载在浏览器指定的位置。我们可以通过手动更改 - 参考 How to specify shere files are downloaded

使用 node 下载图片

这里我们使用 node 来将图片文件下载在指定的位置。

下面是个简单的开启 node 服务的代码:

// 使用 express Web 应用程序框架
const express = require("express");
const fs = require("fs");
const path = require("path");
const bodyParser = require("body-parser");
const app = express();
const port = 3000;

// 设置视图引擎
app.set("view engine", "ejs");

// 设置视图的文件位置
app.set("views", __dirname + "/views");

// 中间件解析 JSON 请求体
app.use(bodyParser.json({ limit: "50mb" }));

app.get("/", (req, res) => {
  // 渲染 index.ejs 模版
  res.render("index", {});
});

// 监听应用程序的开启
app.listen(port, () => {
  console.log(`App listening at http://localhost:${port}`);
});

我们在 index.ejs 模版中发起请求:

// 发送 dataUrl 数据到服务器
fetch("/saveImage", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ imageData: dataUrl })
})
.then((response => response.json()))
.then(data => {
  console.log(`Image saved in ${data.message}`);
})
.catch(error => {
  console.error("Error: ", error);
});

我们用 node 监听接口发送过来的数据:

app.post("/saveImage", (req, res) => {
  // 图片数据
  const { imageData } = req.body;
  
  // 移除数据的 URL 的前缀,根据生成的图片的格式去操作,如果是 jpg 等更改相应内容
  const base64Data = imageData.replace(/^data:image\/png;base64,/, '');
  
  // 生成时间戳
  const timestamp = Date.now();
  const fileName = `${timestamp}.png`;
  
  // 指定保存的位置路劲
  const savePath = path.join(__dirname, "output", "${timestamp}", fileName);
});

  // 确保保存的路劲的目录存在
  fs.mkdirSync(path.dirname(savePath), { recursive: true });
  
  // 写入文件
  fs.writeFileSync(savePath, base64Data, "base64");
  
  // 返回数据给到请求接口
  res.json({ message: `Image saved to ${savePath}` });

然后我们在路由 / 页面触发下载之后,可以看到下载的文件内容

使用 node 删除图片

在图片保存一定的时间之后,我们就需要删除,以节省空间大小。我们实现如下:

我们在路由 /cleanCache 路由上操作,我们不需要在 ejs 上操作什么,一进入路由就执行删除操作,所以不需要对应的 ejs 文件。

对应的 node 代码如下:

app.get("/cleanCache", (req, res) => {
  // 保存下载文件的文件夹
  const outputDir = path.join(__dirname, "output");
  
  // 读取该目录下的所有文件和子目录
  fs.readdir(outputDir, (err, files) => {
    if (err) {
      return res.status(500).send("Unable to scan directory: ", err);
    }
    
    files.forEach(file => {
      const filePath = path.join(outputDir, file);
      
      // 获取文件和目录的状态信息
      fs.stat(filePath, (err, stats) => {
        if (err) {
          console.error("Unable to get file stats: " + err);
          return;
        }
        
        // 获取文件或目录的修改时间
        
        const fileMtime = stats.mtime.getTime();
        const oneMinuteAgo = Date.now() - 60 * 1000; // 这里我们假设删除 1 分钟前的数据
        if (fileMtime < oneMinuteAge) {
          // 如果是目录,则递归删除目录以及文件
          if (stats.isDirectory()) {
            fs.rm(filePath, { recursive: true, force: true }, err => {
              if (err) {
                console.error("Unable to delete directory: " + err);
              } else {
                console.log("Deleted directory: " + filePath);
              }
            });
          } else {
            // 如果是文件,则直接删除
            fs.unlink(filePath, err => {
              if (err) {
                console.error("Unable to delete file: " + err);
              } else {
                console.log("Deleted file: " + filePath);
              }
            });
          }
        }
      });
    });
    
    res.send("Clear Done!");
  });
});

我们删除 output 文件夹下面的过期文件。我们触发 /cleanCache 路由后,此时的 output 文件夹下会为空

到此这篇关于Node保存Canvas图片并删除过期图片的操作步骤的文章就介绍到这了,更多相关Node保存Canvas图片并删除过期内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用Node.js对文件进行重命名

    利用Node.js对文件进行重命名

    最近工作中遇到了对文件进行重命名的需求,后通过node.js实现了,所以下面这篇文章主要给大家介绍了利用Node.js对文件进行重命名的相关资料,文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • node.js+postman+mongodb搭建测试注册接口的实现

    node.js+postman+mongodb搭建测试注册接口的实现

    本文主要介绍了node.js+postman+mongodb搭建测试注册接口的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • node.js利用mongoose获取mongodb数据的格式化问题详解

    node.js利用mongoose获取mongodb数据的格式化问题详解

    这篇文章主要给大家介绍了关于node.js利用mongoose获取mongodb数据的格式化问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习把。
    2017-10-10
  • 使用pm2自动化部署node项目的方法步骤

    使用pm2自动化部署node项目的方法步骤

    这篇文章主要介绍了使用pm2自动化部署node项目的方法步骤,pm2是一个进程管理工具,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 基于Node.js的http模块搭建HTTP服务器

    基于Node.js的http模块搭建HTTP服务器

    这篇文章主要为大家介绍了基于Node.js的http模块来搭建HTTP服务器的示例过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • npm报版本与node.js不匹配问题及解决

    npm报版本与node.js不匹配问题及解决

    这篇文章主要介绍了npm报版本与node.js不匹配问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Node.js实现发送邮件功能

    Node.js实现发送邮件功能

    这篇文章主要为大家详细介绍了Node.js实现发送邮件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • 更新npm项目依赖的实现方法

    更新npm项目依赖的实现方法

    依赖管理是其中一个至关重要的环节,本文主要介绍了更新npm项目依赖的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • nodejs基础应用

    nodejs基础应用

    本文主要介绍了nodejs的基础应用。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Node.js 连接 MySql 统计组件属性的使用情况解析

    Node.js 连接 MySql 统计组件属性的使用情况解析

    这篇文章主要为大家介绍了Node.js 连接 MySql 统计组件属性的使用情况解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10

最新评论