2016-12-22 8 views
2

으로 작성된 Node.js/Express 응용 프로그램에서 업로드 된 이미지의 크기를 조정하려면 sharp을 사용하고 있습니다. 크기 조정이 완료되면 원본 파일을 삭제하고 싶습니다. pnggif 입력 이미지의 경우 작업이 성공적으로 종료되고 크기가 조정 된 이미지가 있고 원본이 삭제됩니다. jpgtif 이미지의 경우, 크기 조정에 성공, 그러나 unlink 명령은 다음과 같은 오류와 함께 실패합니다(node.js 모듈) 예리한 이미지 프로세서가 원본 파일을 열어두고 크기를 조정 한 후 원본의 링크를 끊을 수 없습니다.

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

내가 무엇을 놓치고 :

여기에 설명 된 동작을 테스트 할 수있는 코드는?

+0

'샤프한'약속이 작동합니까? '기다릴 수 있을까? – robertklep

+0

@robertklep 예 : http://sharp.dimens.io/en/stable/api-output/ toFile()은 콜백이 제공되지 않을 때 약속을 반환합니다. –

+0

일반적으로 열려있는 파일에 대해'unlink '를 호출하는 것은 유닉스 유형 OS에서 문제가되지 않습니다. 왜냐하면 당신이 슬래시를 사용하기 때문에 사용하고 있다고 가정했기 때문입니다. Windows 사용자 인 경우 [이 문제] (https://github.com/lovell/sharp/issues/487) 및 해당 솔루션을 확인하십시오. – robertklep

답변

4

유닉스 유형의 OS를 사용한다고 가정 할 때 처음에는 슬래시를 사용하여 던졌습니다. 여전히 열려있는 파일의 unlink을 호출하는 것이 일반적으로 문제가되지 않습니다.

그러나 Windows에, 나는 열려있는 파일은 일반적으로 삭제되는 것을 보호하는 것을 생각하고 this issue 또한 솔루션을 비슷한 문제를 설명하고 : 내부, sharp 원본을 차단합니다 (오픈) 파일의 캐시가 유지 관리 파일이 삭제되지 않도록하십시오. 해당 캐시를 사용하지 않도록 설정하면

는 문제가 해결되어야한다

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

here을 문서화.

+1

약간의 수정 : sharp (...). cache는 함수가 아닙니다. sharp.cache (...)를 호출하고 체인 된 명령으로 생성자를 선명하게 (...) 따로 호출해야했습니다. –

+1

@ AndrásSzepesházi 해명 해 주셔서 감사합니다. 전체 캐시 함수가 문서에서 누락 된 것 같습니다. 어떻게 작동하는지 추측해야했습니다. 나는 내 대답을 업데이트 할 것이다 : D – robertklep

+0

캐시는 유틸리티 아래에있다. http://sharp.dimens.io/en/stable/api-utility/#cache –