2013-03-18 130 views
4

我正在構建一個NodeJs SOAP客戶端。最初,我想象服務器(即節點SOAP客戶端)允許通過REST API下載文檔(REST API經過驗證)。在Google和SO上花了很長時間之後,看起來這是不可能的。使用NodeJs提供臨時文件

這意味着當請求文檔下載時,我將不得不爲文檔進行SOAP調用,並通過AJAX將URL返回給REST客戶端。

爲了做到這一點,我需要:

  1. 暫時創建節點
  2. 文件中獲得的URL,並返回到Web客戶端
  3. 當請求文件併發送響應,刪除文件(出於安全目的)

這裏是我的問題:

  1. 有沒有這樣的框架? temp module可能是一個選項,但我真的想在每次請求後刪除,而不是在一段時間後刪除。
  2. 如果不是,我可以只使用NodeJs文件系統和Express static module?基本上,我們將修改靜態模塊看起來像這樣:

    return function static(req, res, next) { 
        if ('GET' != req.method && 'HEAD' != req.method) return next(); 
        var path = parse(req).pathname; 
        var pause = utils.pause(req); 
    
    /* My Added Code Here */ 
    res.on('end', function(){ 
        // delete file based on req URL 
    }) 
    /* end additions */ 
    
    function resume() { 
        next(); 
        pause.resume(); 
    } 
    
    function directory() { 
        if (!redirect) return resume(); 
        var pathname = url.parse(req.originalUrl).pathname; 
        res.statusCode = 301; 
        res.setHeader('Location', pathname + '/'); 
        res.end('Redirecting to ' + utils.escape(pathname) + '/'); 
    } 
    function error(err) { 
        if (404 == err.status) return resume(); 
        next(err); 
    } 
    send(req, path) 
        .maxage(options.maxAge || 0) 
        .root(root) 
        .hidden(options.hidden) 
        .on('error', error) 
        .on('directory', directory) 
        .pipe(res); 
    }; 
    

res.on('end',... vaild?或者,我應該創建一些中間件來處理指向臨時文件的URL嗎?

回答

18

找到兩個SO問題來回答我的問題。所以顯然我們不需要使用express.static中間件。我們只需要在文件系統download a file

app.get('/download', function(req, res){ 
var file = __dirname + '/upload-folder/dramaticpenguin.MOV'; 
res.download(file); // Set disposition and send it. 
}); 

如果我們想stream and then delete如下:

app.get('/download', function(req, res){ 
    var stream = fs.createReadStream('<filepath>/example.pdf', {bufferSize: 64 * 1024}) 
    stream.pipe(res); 

    var had_error = false; 
    stream.on('error', function(err){ 
     had_error = true; 
    }); 
    stream.on('close', function(){ 
    if (!had_error) fs.unlink('<filepath>/example.pdf'); 
}); 
+0

完全真棒,你救了我這麼多時間去弄清楚自己。先生+1。 – 2013-10-21 19:57:40

+0

Kickass解決方案!現在搜索了幾天,很高興我找到了這個。 +1! – Neurax 2015-10-23 15:42:54

10

如果您在2015年12月後訪問這個頁面SO,你可能會發現以前的解決方案是不工作(至少它不適合我)。我找到了一個不同的解決方案,所以我想我會在這裏爲未來的讀者提供它。

app.get('/download', function(req, res){ 
    res.download(pathToFile, 'fileNameForEndUser.pdf', function(err) { 
     if (!err) { 
      fs.unlink(path); 
     } 
    }); 
});