Node.js 存档器需要通过 glob 排除文件类型的语法

2024-03-13

使用 archiver.js(适用于 Node.js),我需要从递归(多子目录)存档中排除图像。这是我的代码:

const zip = archiver('zip', { zlib: { level: 9 } });
const output = await fs.createWriteStream(`backup/${fileName}.zip`);
res.setHeader('Content-disposition', `attachment; filename=${fileName}.zip`);
res.setHeader('Content-type', 'application/download');
output.on('close', function () {
  res.download(`backup/${fileName}.zip`, `${fileName}.zip`);
});
output.on('end', function () {
  res.download(`backup/${fileName}.zip`, `${fileName}.zip`);
});
zip.pipe(output);
zip.glob('**/*',
  {
    cwd: 'user_uploads',
    ignore: ['*.jpg', '*.png', '*.webp', '*.bmp'],
  },
  {});
zip.finalize();

问题是它没有排除忽略文件。我怎样才能纠正语法?


Archiver https://www.npmjs.com/package/archiver uses Readdir-Glob https://www.npmjs.com/package/readdir-glob对于通配符使用小型比赛 https://www.npmjs.com/package/minimatch匹配。

中的匹配Readdir-Glob https://www.npmjs.com/package/readdir-glob (node-readdir-glob/index.js#L147 https://github.com/Yqnn/node-readdir-glob/blob/master/index.js#L147)是针对包括路径名的完整文件名完成的,它不允许我们应用该选项matchBase https://www.npmjs.com/package/minimatch#matchbase这只是完整路径的基本名称。

为了让它发挥作用,你有两个选择:


1. 使你的 glob 排除文件扩展名

您可以使用 glob 否定转换您的 glob 表达式以排除您不希望出现在存档文件中的所有文件扩展名!(...)它将包括除与否定表达式匹配的内容之外的所有内容:

zip.glob(
  '**/!(*.jpg|*.png|*.webp|*.bmp)',
  {
    cwd: 'user_uploads',
  },
  {}
);

2. Make 小型比赛 https://www.npmjs.com/package/minimatch使用完整文件路径名

To make 小型比赛 https://www.npmjs.com/package/minimatch在我们无法设置的情况下工作matchBase https://www.npmjs.com/package/minimatch#matchbase选项,我们必须包含匹配的目录 glob 才能使其工作:

zip.glob(
  '**/*',
  {
    cwd: 'user_uploads',
    ignore: ['**/*.jpg', '**/*.png', '**/*.webp', '**/*.bmp'],
  },
  {}
);

行为

这种行为的Readdir-Glob https://www.npmjs.com/package/readdir-glob有点令人困惑ignore option:

Options https://www.npmjs.com/package/readdir-glob#options

ignore:用于排除匹配的 Glob 模式或 Glob 模式数组。如果文件或文件夹至少与所提供的模式之一匹配,则不会返回。它不会阻止返回文件夹内容中的文件。

这意味着igrore items 必须是实际的全局表达式必须包含整个路径/文件表达式。当我们指定*.jpg,它将匹配文件仅在根目录中 and 不是子目录。如果我们想排除目录树深处的 JPG 文件,我们必须使用包括所有目录模式加上文件扩展名模式是**/*.jpg.

仅排除子目录中的内容

如果您只想排除特定子目录中的某些文件扩展名,可以使用如下否定模式将子目录添加到路径中:

// The glob pattern '**/!(Subdir)/*.jpg' will exclude all JPG files,
// that are inside any 'Subdir/' subdirectory.

zip.glob(
  '**/*',
  {
    cwd: 'user_uploads',
    ignore: ['**/!(Subdir)/*.jpg'],
  },
  {}
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 存档器需要通过 glob 排除文件类型的语法 的相关文章

随机推荐