2014-09-13 3 views
0

'express', 'fs'및 'busboy'모듈을 사용하여 파일을 업로드 할 노드 서버를 만들고 있습니다. 서버가 예상대로 작동하지만 완료 전에 업로드를 취소하면 불완전한 파일이 파일 시스템에 저장됩니다. 불완전한 파일은 어떻게 제거 할 수 있습니까?불완전한 업로드 파일을 제거하는 방법?

var express = require("express"), 
fs = require("fs"), 
Busboy = require("busboy"); 
app = express(); 
app.listen(7000); 
app.get("/", display_form); 
app.post("/upload", function(req, res) { 
var busboy = new Busboy({ 
    headers: req.headers 
}); 
busboy.on("file", function(fieldname, file, filename, encoding, mime) { 
    var fstream = fs.createWriteStream("./uploads/" + filename); 
    file.pipe(fstream); 
    file.on("data", function(chunk) { 
     console.log(chunk.length); 
    }); 
    file.on("end", function() { 
     console("end"); 
    }); 

    fstream.on("close", function() { 
     fstream.close(); 
     console("fstream close"); 
    }); 
    fstream.on("error", function() { 
     console("fstream error "); 
    }); 
}); 
busboy.on("finish", function() { 
    console.log("uploaded"); 
    res.send("file uploaded"); 
}); 
busboy.on("error", function() { 
    console("error busboy"); 
}); 
req.pipe(busboy); 
}); 

답변

2

덕분에 결국 나는이 문제에 대한 방법을 발견했다. 언급 된 코드 조각과 그 잘 작동하는 아래에 추가했습니다.

req.on("close", function(err) { 
     fstream.end(); 
     fs.unlink('./uploads/' + name); 
     console.log("req aborted by client"); 
    }); 
1

나는 버스 사인을 모르지만 스트림을 열어 본적이 없습니다. 스트림과 파일 이름을 악용하여 '완료'및 '오류'를 일으켜 적절하게 행동하지 않는 이유는 무엇입니까?

예 : 당신의 도움과 I에 대한

busboy.on('error', function() { 
    fs.unlink('./uploads/' + filename); 
    console.log('error busboy'); 
} 
+0

죄송 합니다만 업로드가 완료되면 제어 권한 만 얻을 수 있습니다. 이 경우 컨트롤은 오류 처리 블록 중 아무 것도 수행하지 않습니다. –

+0

서버 쪽에서 사용자가 연결을 실패했거나 취소했는지 확인할 수있는 방법이 없다면 업로드가 완료되었는지 확인할 수 없습니다. 헤더에 몇 바이트를 받아야하는지 알려주는 것이 있습니까? 그래서'on (close) '에 체크를 할 수 있습니다. (카운팅은 인코딩에 크게 의존합니다.) – CFrei