2016-05-26 108 views
0

設置MEAN堆棧應用程序僅在成功完成表單時下載PDF附件的最簡單方法是什麼?僅在成功的表單提交時才提供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

如何成功的表單提交後生成的令牌文件(這個答案我假設你使用蒙戈),只需用鍵導航到網址:

window.location.href = '/download/sometokenhere'; 

,並在服務器端:

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 

有很多方面...

另一種方式是當表單成功時,然後通過downloadLink返回json響應,然後導航到將被視爲文件下載的url。

+1

謝謝。這幫了很多。 –