2016-05-26 7 views
0

フォームの正常終了時にのみPDF添付ファイルをダウンロードするには、MEANスタックアプリケーションを設定する最も簡単な方法は何ですか?フォームに成功したフォームにのみPDFを提出する

注:ユーザー管理はありません。誰もがこのフォームを見ることができます。彼らが正しく記入すると、フォームをダウンロードできるはずです。しかし、たとえば、URLを電子メールで共有可能にすることは望ましくありません。 PDFを入手する唯一の方法は、フォームに記入することです。 (もちろん、PDFがそこから誰に電子メールで送信することができるが、これは結構です。)

現在のところ、PDFはそうのようなNodeJS/Expressエンドポイント訪問することによってのみ、ダウンロードすることができます。

app.get('/endpoint', function(req, res) { 
    res.setHeader('Content-disposition', 'attachment;'); 
    res.setHeader('Content-type', 'application/pdf'); 
    var file = __dirname + '/pdf/ebook.pdf'; 
    res.download(file); 
}); 

/pdfは直接公開することはできません。

これを行うことができる方法についていくつかの考え:

  1. ウェブサイトの各訪問者が特別なキーを受け取り、彼らは正しくフォームに必要事項を記入すれば、訪問「/ specialkeyは」ダウンロードするための一時的なエンドポイントになり電子ブック。その後、クライアントでは$window.location.assign('/specialkey');が実行され、電子ブックがダウンロードされます。

ただし、各ユニークユーザーにキーを送信する最良の方法は何かわかりません。また、概念的に単純なことはあまりにも複雑に思えます。 「成功したフォーム提出時にのみ電子書籍を提供する」

誰もがこれまでに遭遇したことはありますか?

SOLUTION:

サーバー:

var session = require('express-session'); 

... 

app.use(session({ 
    secret: 'your secret here', 
    name: 'your session name here', 
    proxy: true, 
    resave: true, 
    saveUninitialized: true 
})); 

... 

// Send the session ID to the client 
app.get('/key', function(req, res) { 
    res.send(req.session.id); 
}); 

// Download PDF 
app.get('/download/:token', function(req, res) { 
    if (req.params.token === req.session.id) { 
     res.setHeader('Content-disposition', 'attachment;'); 
     res.setHeader('Content-type', 'application/pdf'); 
     // Note: /pdf directory is not publicly accessible 
     var file = __dirname + '/pdf/ebook.pdf'; 
     res.download(file); 
    } else { 
     res.sendFile(__dirname + '/public/index.html'); 
    } 
}); 

クライアント:

$http.get('/key').then(function(response) { 
    vm.key = response.data; 
}); 

... 

// Then on successful form completion, call: 
$window.location.assign('/download/' + vm.key); 

答えて

1

どのように成功したフォームは、トークンの文書を生成するために、投稿後約(この答えに、私はあなたがモンゴを使用することを前提としてい)、キーでURLに移動するだけです。

とサーバ側で210:

app.get('/download/:token', function(req, res) { 
    // for example we use mongodb with mongoose 
    TokenModel 
    .find({token: req.params.token}) 
    .count() 
    .exec(function(err, count) { 
     if(err || parseInt(count) == 0) { 
      return res.redirect('/'); 
      // or: return res.status(403).send('Forbidden'); 
     } 

     res.setHeader('Content-disposition', 'attachment;'); 
     res.setHeader('Content-type', 'application/pdf'); 
     var file = __dirname + '/pdf/ebook.pdf'; 
     res.download(file); 
     }); 
}); 

またはあなたが設定することができます。

req.session.downloadToken = md5(new Date().getTime()); 

を、ダウンロードルートにだけトークンがに等しいかどうかを確認:

req.session.downloadToken 

があります多くの方法...

別の方法は、フォームが正常で、ダウンロードリンクがあるjsonレスポンスを返し、ダウンロードするファイルとして扱われるURLに移動するだけです。

+1

ありがとうございます。これは多くの助けとなりました。 –

関連する問題