使用NodeJs提供临时文件

我正在构build一个NodeJs SOAP客户端。 最初,我想象服务器(即节点SOAP客户端)将允许通过REST API(REST API被authentication)下载文档。 在Google和SO上花了很长时间之后,看起来像是不可能的。

这意味着当请求文档下载时,我将不得不为文档进行SOAP调用,并通过AJAX将URL返回给REST客户端。

为了做到这一点,我需要:

  1. 在Node中临时创build一个文件
  2. 获取它的URL并返回到Web客户端
  3. 当请求文件并发送响应时,删除文件(出于安全目的)

这是我的问题:

  1. 有没有这样的框架? 临时模块可能是一个选项,但我真的想在每个请求后删除,而不是一段时间后。
  2. 如果不是,我可以使用NodeJs文件系统和Express 静态模块来做到这一点吗? 基本上我们会修改静态模块看起来像这样:

    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?或者,我应该创build一些中间件来处理指向临时文件的URL吗?

find两个SO问题来回答我的问题。 所以显然我们不需要使用express.static中间件。 我们只需要文件系统来下载一个文件 :

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

如果我们想stream,然后删除按照:

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

如果您在2015年12月之后访问此SO页面,您可能会发现以前的解决scheme不起作用(至less它不适用于我)。 我find了一个不同的解决scheme,所以我想我会在这里提供给未来的读者。

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