【问题标题】:Serving Temporary Files with NodeJs使用 NodeJ 提供临时文件
【发布时间】:2013-03-18 18:38:43
【问题描述】:

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

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

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

  1. 在Node中临时创建文件
  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',... 有效吗?或者,我应该为指向临时文件的 URL 创建一些中间件吗?

【问题讨论】:

    标签: node.js static


    【解决方案1】:

    找到两个回答我的问题的 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 先生。
    • Kickass 解决方案!已经找了几天了,很高兴我找到了这个。 +1 !!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多