使用NodeJ提供临时文件

时间:2013-03-18 18:38:43

标签: node.js static

我正在构建一个NodeJs SOAP客户端。最初,我想象服务器(即节点SOAP客户端)允许通过REST API下载文档(REST API经过身份验证)。在Google和SO上花了很多时间后,看起来这是不可能的。

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

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

  1. 在Node
  2. 中临时创建文件
  3. 获取其网址并返回网络客户端
  4. 请求文件并发送响应时,请删除该文件(出于安全目的)
  5. 以下是我的问题:

    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);
      };
      
    3. res.on('end',...是否有效?或者,我应该为指向临时文件的URL创建一些中间件吗?

2 个答案:

答案 0 :(得分:20)

找到两个回答我问题的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');
});

答案 1 :(得分:10)

如果您在2015年12月之后访问此SO页面,您可能会发现之前的解决方案无效(至少它不适用于我)。我找到了一个不同的解决方案,所以我想我会在这里为未来的读者提供。

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