(node.js 模块)sharp 图像处理器保持源文件打开,在调整大小后无法取消链接原始文件
(node.js module) sharp image processor keeps source file open, unable to unlink original after resize
我正在使用 sharp 调整用 Typescript
编写的 Node.js
/ Express
应用程序中上传的图像的大小。成功调整大小后,我想删除原始文件。对于 png
和 gif
输入图像,操作成功终止,我有调整大小的图像,原始图像被删除。对于 jpg
和 tif
图像,调整大小成功,但是 unlink
命令失败并出现以下错误:
EBUSY: resource busy or locked, unlink '...'
好像 sharp().resize()
即使在调整大小操作完成后仍会保持输入文件锁定。
这是测试所描述行为的代码:
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));
}
我错过了什么?
我最初被你使用正斜杠所困扰,假设你使用的是 Unix 类型 OS,其中调用 unlink
一个仍然打开的文件通常是'没问题。
然而,在Windows上,我认为打开的文件通常被保护不被删除,this issue描述了一个类似的问题,也是一个解决方案:在内部,sharp
维护(打开的)文件的缓存,它将阻止原始文件被删除。
如果禁用该缓存,问题应该得到解决:
// add this at the top of your code
sharp.cache({ files : 0 });
已记录 here。
编辑:如某些评论所述,上面的代码可能无法解决问题。相反,使用这个:
sharp.cache(false);
在内部,sharp 维护(打开)文件的缓存,这将阻止原始文件被删除。
sharp.cache(false)
;
上面一行添加您的 REST API
我正在使用 sharp 调整用 Typescript
编写的 Node.js
/ Express
应用程序中上传的图像的大小。成功调整大小后,我想删除原始文件。对于 png
和 gif
输入图像,操作成功终止,我有调整大小的图像,原始图像被删除。对于 jpg
和 tif
图像,调整大小成功,但是 unlink
命令失败并出现以下错误:
EBUSY: resource busy or locked, unlink '...'
好像 sharp().resize()
即使在调整大小操作完成后仍会保持输入文件锁定。
这是测试所描述行为的代码:
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));
}
我错过了什么?
我最初被你使用正斜杠所困扰,假设你使用的是 Unix 类型 OS,其中调用 unlink
一个仍然打开的文件通常是'没问题。
然而,在Windows上,我认为打开的文件通常被保护不被删除,this issue描述了一个类似的问题,也是一个解决方案:在内部,sharp
维护(打开的)文件的缓存,它将阻止原始文件被删除。
如果禁用该缓存,问题应该得到解决:
// add this at the top of your code
sharp.cache({ files : 0 });
已记录 here。
编辑:如某些评论所述,上面的代码可能无法解决问题。相反,使用这个:
sharp.cache(false);
在内部,sharp 维护(打开)文件的缓存,这将阻止原始文件被删除。
sharp.cache(false)
;
上面一行添加您的 REST API