【问题标题】:Watch folder on server for new images to compress监视服务器上的文件夹以压缩新图像
【发布时间】:2015-07-09 04:45:39
【问题描述】:

我有一个服务器,它可以上传很多图片。上传图像的应用程序基于 PHP。但是,我想使用 Node 来查看上传文件夹,然后在任何新图像上运行 imagemin。

我在想我会使用 npm 包 'watch' 和 'imagemin'。我不确定如何准确配置它们或如何让它一直运行。

到目前为止,我有以下可以手动打开的功能:

var Imagemin = require('imagemin');
var watch = require('watch');
var imagemin = new Imagemin()
  .use(Imagemin.pngquant());
watch.createMonitor('images', function (monitor) {
  monitor.files['images/*.png']
  monitor.on("created", function (file) {
    compressImage(file);
  })
  monitor.on("changed", function (file) {
    compressImage(file);
  });
});

function compressImage(file) {
  var dest, path;
  path = f.split('/');
  path.pop();
  dest = path.join('/');
  imagemin.src(file).dest(dest).run();
}

在添加了几个文件后,我收到了关于 possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit 的警告,然后它停止工作。

有没有更好的方法来做到这一点以及如何自动运行它?

【问题讨论】:

    标签: javascript node.js watch imagemin


    【解决方案1】:

    为了处理在变化时递归触发 watch 函数,一种可能的解决方案是: 每当你的压缩函数运行时,让它将文件名存储在一个 var 中。在您的更改侦听器功能上,只需添加

    If (file !== lastFile) {
       //do something
    }
    

    您可以尝试另一个非常相似的模块,称为chokidar

    具有与 watch 非常相似的钩子:

    watcher.on('add', function(path) { log('File', path, 'has been added'); })
    watcher.on('change', function(path) { log('File', path, 'has been changed'); })
    

    此处的示例:Watch Files and Directories

    【讨论】:

    • 我认为问题在于,当它覆盖图像时,它发现它发生了变化并尝试再次压缩它。我不确定如何在不将文件移动到另一个位置的情况下完成此操作。
    • 您还可以添加第二层验证,检查最后一个文件名和时间戳。这样,如果再次上传相同的文件,它将再次被压缩,只要它不是在最后 10 秒内或其他任何时间。
    • 我修改了上传到旧文件的内容被删除而不是被覆盖,这意味着我只需要添加事件。我相信我的脚本现在可以工作了,只需要在服务器启动时让它运行。
    猜你喜欢
    • 2015-11-17
    • 2020-08-12
    • 2017-02-01
    • 2023-03-06
    • 2014-02-13
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多