12

NodeJs SOAP クライアントを構築しています。当初、私はサーバー (ノード SOAP クライアント) が REST API を介してドキュメントをダウンロードできるようにする (REST API は認証済み) と考えていました。GoogleとSOでかなりの時間を費やした後、それは不可能のようです。

つまり、ドキュメントのダウンロードが要求された場合、ドキュメントの SOAP 呼び出しを行い、AJAX を介して URL を REST クライアントに返す必要があります。

これを行うには、次のことが必要です。

  1. Nodeにファイルを一時的に作成する
  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',...か?または、一時ファイルを指す URL に対してこれを行うミドルウェアを作成する必要がありますか?

4

2 に答える 2

28

私の質問に答える2つのSO質問を見つけました。したがって、express.staticミドルウェアを使用する必要はないようです。ファイルをダウンロードするには、ファイルシステムが必要です。

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

ストリーミングしてから削除する場合は、次のようにします。

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');
});
于 2013-03-18T22:38:11.333 に答える
11

2015 年 12 月以降にこの SO ページにアクセスしている場合は、以前のソリューションが機能していないことに気付くかもしれません (少なくとも、私にとっては機能していません)。別の解決策を見つけたので、将来の読者のためにここで提供すると思いました。

app.get('/download', function(req, res){
    res.download(pathToFile, 'fileNameForEndUser.pdf', function(err) {
        if (!err) {
            fs.unlink(path);
        }
    });
});
于 2015-12-02T21:33:23.860 に答える