2016-03-29 19 views
0

Bir dosya indirmek için kullanıyorum bir sunucu tarafı yolu var. Bu bir istemci tarafı düğme tıklaması denir ve her şey iyi çalışıyor. Ancak, düğmeye bir kez tıklandığında, başka bir rota yüklenene kadar tekrar çalışmayacak ve geri döneceksiniz. Düğmeyi birden çok kez tıklatıp sunucu tarafı rotası her seferinde tetiklenecek şekilde nasıl kodlayabilirim?Sunucu tarafı yolu dosyayı indirmek için

Benim düğme kodu

Belki
Router.route('/download_document/:_id', function() { 

    //Get the file record to download 
    var file = files.findOne({_id: this.params._id}); 

    //Function to take a cfs file and return a base64 string 
    var getBase64Data = function(file2, callback) { 
    var readStream = file2.createReadStream(); 
    var buffer = []; 
    readStream.on('data', function(chunk) { 
     buffer.push(chunk); 
    }); 
    readStream.on('error', function(err) { 
     callback(err, null); 
    }); 
    readStream.on('end', function() { 
     callback(null, buffer.concat()[0].toString('base64')); 
    }); 
    }; 

    //Wrap it to make it sync  
    var getBase64DataSync = Meteor.wrapAsync(getBase64Data); 

    //Get the base64 string 
    var base64str = getBase64DataSync(file); 

    //Get the buffer from the string 
    var buffer = new Buffer(base64str, 'base64'); 

    //Create the headers 
    var headers = { 
    'Content-type': file.original.type, 
    'Content-Disposition': 'attachment; filename=' + file.original.name 
    }; 

    this.response.writeHead(200, headers); 
    this.response.end(buffer, 'binary'); 

}, { where: 'server' }); 

cevap

0

Eğer sadece bir yoluyla Server bir nesne dönmelidir ...

'click #view_document_download': function (event, tmpl) { 
    Router.go('/download_document/' + this._id); 
} 

Ve benim sunucu tarafı rota şöyle ... şuna benzer yöntem ve müşteri tarafında bir dosyaya? eğer mümkünse ..

İstemci tarafında bir dosya oluşturmak çok basittir ve bu noktada Yönlendiriciler ile uğraşmak zorunda kalmazsınız. sunucudaki yerine js arasında

 function outputFile(filename, data) { 
 
     var blob = new Blob([data], {type: 'text/plain'}); // !note file type.. 
 
     if(window.navigator.msSaveOrOpenBlob) { 
 
      window.navigator.msSaveBlob(blob, filename); 
 
     } 
 
     else{ 
 
      var elem = window.document.createElement('a'); 
 
      elem.href = window.URL.createObjectURL(blob); 
 
      elem.download = filename;   
 
      document.body.appendChild(elem) 
 
      elem.click();   
 
      document.body.removeChild(elem); 
 
     } 
 
    } 
 
     
 
    function getContentAndOutputFile() { 
 
     var content = document.getElementById('content').value; 
 

 
     outputFile('file.txt', content); 
 
    }
<input id="content" value="test content"/> 
 
<button onClick="getContentAndOutputFile()">Create File</button>

+0

Bunu yapabilirim ancak bu sunucu tarafında bir çalışma çözümüm var ve her seferinde sıfırlamak istediğim yol. Bunun mümkün olup olmadığını bilmek istiyorum. – mdgsoftware

+0

Ayrıca, standart bir sunucu tarafı yüklemesi üzerinden çözümünüzün performans etkisini anlamak ister misiniz? – mdgsoftware

+0

Performans ile ilgili olarak, basit, dosyayı bir kez istemciye indirin. Sonraki Saat Sadece tıklayarak aynı dosyayı alır, Sunucu – webdeb

0

kullanım a eleman 'click' olayı
sayfa html

<a href="/download_document/{{_id}}" download="true" target="_blank"></a> 

sayfa js

Router.route("/download_document/:fileId", function(){ 
    var file = files.findOne({_id: this.params.fileId}); 
    var contentFile = //file text 
    let headers = { 
     'Content-Type': 'text/plain', 
     'Content-Disposition': "attachment; filename=file.txt" 
    }; 
    this.response.writeHead(200, headers); 
    this.response.end(contentFile); 
    }, 
    {where: "server", name: "download"} 
); 
İlgili konular