(node.js模块)清晰的image processing器保持源文件打开,resize后无法解开原始链接

我正在使用sharp来调整在Typescript编写的Node.js / Express应用程序中上传的图像的大小。 成功resize后,我想删除原始文件。 对于pnggifinput图像,操作终止成功,我有resize的图像和原始被删除。 对于jpgtif图像,resize是成功的,但unlink命令会失败,并显示以下错误:

EBUSY:资源忙或locking,取消链接“…”

好像sharp().resize()仍然会保持input文件被locking,即使在resize操作完成之后。

这里是testing描述行为的代码:

 import { existsSync, unlinkSync } from "fs"; import { normalize, parse } from "path"; var argv = require("yargs").argv; var sharp = require("sharp"); var appRoot = require("app-root-path") + "/"; let resizeTest = async function (filename: string): Promise<boolean> { try { let nameParts = parse(filename); let source = appRoot + filename; let destination = appRoot + nameParts.name + "_resized" + nameParts.ext; let fileExists = await existsSync(source); if (!fileExists) { console.log("Input file not found. Exiting."); return false; } let resizeResult = await sharp(source) .resize(128, 128) .toFile(destination); console.log("Resize operation terminated: ", resizeResult); await unlinkSync(source); console.log("unlinkSync operation terminated."); return true; } catch (error) { console.log("An error occured during resizeTest execution: ", error.message); return false; } } if (argv._.length === 0) { console.log("Usage: node sharptest.js FILENAME"); } else { let resizeResult: Promise<boolean> = resizeTest(argv._[0]); resizeResult.then(result => console.log("Returning from execution with ", result)); } 

我错过了什么?

我最初是由于使用正斜杠而引发的,假设你使用的是一个Unixtypes的操作系统,在这个操作系统中,调用一个仍然打开的文件的unlink并不是一个问题。

但是,在Windows上,我认为打开的文件通常不会被删除, 这个问题描述了一个类似的问题,也是一个解决scheme:在内部, sharp维护(打开)文件caching,这将阻止原始文件删除。

如果您禁用该caching,则应该修复该问题:

 // add this at the top of your code sharp.cache({ files : 0 }); 

logging在这里 。

Interesting Posts