12

我正在使用SharpNode.js来调整/Express应用程序中上传的图像的大小Typescript。成功调整大小后,我想删除原始文件。对于pnggif输入图像,操作成功终止,我有调整大小的图像,原始图像被删除。对于jpgtif图像,调整大小是成功的,但是unlink命令失败并出现以下错误:

EBUSY:资源繁忙或锁定,取消链接'...'

好像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));
}

我错过了什么?

4

2 回答 2

14

我最初被您使用正斜杠所引发,假设您使用的是 Unix 类型的操作系统,在该操作系统中调用unlink仍然打开的文件通常不是问题。

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

如果禁用该缓存,则应解决问题:

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

记录在这里

编辑:如一些评论中所述,上面的代码可能无法解决问题。相反,使用这个:

sharp.cache(false);
于 2016-12-22T18:54:08.117 回答
0

在内部,sharp 维护(打开)文件的缓存,这将阻止原始文件被删除。

sharp.cache(false);

上面的行添加你的 REST API 的开始

于 2020-11-16T05:24:57.417 回答