2012-08-01 1 views
5

Express.js을 사용 중이며 크기를 조정해야하는 이미지를 업로드하는 경로가 있습니다. 현재 나는 단지 Express 디스크에 파일을 작성하게하고 (커버 내에서 node-formidable을 사용한다고 생각합니다) 디스크에 두 번째 버전을 쓰는 gm (http://aheckmann.github.com/gm/)을 사용하여 크기를 조정합니다. 당신이 그것을 디스크에 기록하기 전에 node-formidable 파일 스트림의 보류를 얻을 수 있고, gm 때문에 대신 경로의 흐름을 받아 들일 수 읽었습니다double.write를 제거하기 위해 Express.js와 gm을 통해 업로드 된 스트림 파일

gm(path) 
    .resize(540,404) 
    .write(dest, function (err) { ... }); 

,이 권리를 통과 할 수 있어야한다 디스크에 이중 쓰기를 제거함으로써.

은 내가 form.onPart를 오버라이드 (override) 할 필요가 있다고 생각하지만 (이 Express 미들웨어?으로 수행해야합니다)와 나는 form의 보류 또는 정확히 무엇 part 함께 할 수있는 활용하는 방법을 잘 모르겠어요 어디 모르겠어요. 다음은 몇 군데에서 본 코드 골격입니다.

form.onPart = function(part) { 
    if (!part.filename) { form.handlePart(part); return; } 

    part.on('data', function(buffer) { 

    }); 
    part.on('end', function() { 

    } 
} 

누군가이 두 부분을 결합하는 데 도움을 줄 수 있습니까? 감사!

답변

7

form.onPart을 다시 작성하면 올바른 길을 걷게됩니다. Formidable은 기본적으로 디스크에 씁니다. 그러기 전에 행동하기를 원합니다.

부품 자체는 스트림이므로 gm을 포함하여 원하는대로 파이프 할 수 있습니다. 나는 그것을 테스트하지 않은,하지만이 문서에 따라 의미한다 : 나는 연결/익스프레스에서 multipart 미들웨어를 CopyPaste에 줄과에 onPart 기능을 추가 미들웨어로

var form = new formidable.IncomingForm; 
form.onPart = function (part) { 
    if (!part.filename) return this.handlePart(part); 

    gm(part).resize(200, 200).stream(function (err, stdout, stderr) { 
    stdout.pipe(fs.createWriteStream('my/new/path/to/img.png')); 
    }); 
}; 

을 : http://www.senchalabs.org/connect/multipart.html

formidable이 기본적으로 디스크에 쓰지 않았거나 플래그를 취한다면 훨씬 좋을 것입니다. 그렇지 않습니까? 그들에게 문제를 보낼 수 있습니다.

+0

감사합니다. 이것은 나에게 거기의 길의 95 %를 줬다. 마지막 문제는'gm'이 비동기 적이기 때문에 크기 조정이 실제로 완료되기 전에 형식 구문 분석이 반환된다는 것입니다. 즉, 클라이언트로 돌아온 URL이 아직 만족스럽지 않습니다. 'partid'처리가 실제로 완료되었을 때 '강력 함'을 알릴 수있는 방법이 있습니까? – Bill

+0

실제로, 나는 대신에 클라이언트에서 이것을 처리하는 것을 끝내었다. 다시 한 번 감사드립니다! – Bill

+1

stdout이 스트림입니다. 그래서 파일을 WriteStream 파일로 pipe() 할 수 있습니다. 그리고 그것은 당신이들을 수있는 "끝"이벤트를 가지고 있음을 의미합니다. stdout.on ('end', fn)을 수행하면 클라이언트에게 작업이 완료되었음을 알릴 수 있습니다. – juandopazo