2016-10-02 7 views
1

Ich erstelle eine .xlsx Datei und lege sie dann in "../web.browser/app/cheques.xlsx". Wie ich es verstehe, ist es ein Äquivalent von Öffentlichen Ordnern innerhalb des Builds. Das Problem ist, dass ich es nicht zum Download bereitstellen kann.Benutzer darf Datei aus dem Öffentlichen Ordner herunterladen Meteor.js

Dies ist ein Codefragment in Server-Methode, wo ich eine Datei in diesen Ort zu Ort:

workbook.xlsx.writeFile("../web.browser/app/cheques.xlsx") 
    .then(function() { 
    console.log('done'); 
    }); 

Also soll ich fs oder Picker.route die Arbeit zu tun?

Antwort

3

Es ist nicht ratsam, dies zu tun. In der Produktion steht das Build-Verzeichnis sowieso nicht zur Verfügung.

Sie haben ein paar Möglichkeiten:

  1. Speichern, um die Dateien in einer definierten Stelle im Dateisystem (nicht /public), dass etwas anderes wie Apache von
  2. Shop in eine die Dateien dienen können Amazon S3 Eimer, und dann lassen sie AWS dienen sie
  3. Speichern, um die Dateien in einer Mongo Sammlung, uing ein Paket wie dieses https://github.com/vsivsi/meteor-file-collection

Ich bevorzuge die letzte, da alle Ihre Daten und Dateien an einem Ort sind.

+0

Vielen Dank für Ihre Antwort. Ich habe gerade einen Stream erstellt, ohne die Datei auf Server oder Client zu speichern. Ich werde meine Lösung unten zeigen, wird aber Ihre Antwort als richtig markieren. –

2

Hier ist die Lösung, die mich sehr glücklich gemacht hat. Dank Vorschlag meines Freundes, legte ich .xlsx Erzeugungs Code in einem server-side route:


Excel = require('exceljs'); 
fs = require('fs'); 

Picker.route('/export/:_cheques', function(params, req, res, next) { 
    let data = Cheques.find(query).map((it) => { 
     return { 
     cheque_number: it.cheque_number, // & other data 
     } 
    }); 

    let workbook = new Excel.Workbook(); 

    let sheet = workbook.addWorksheet('Cheques', { properties: { tabColor: { argb: 'FFC0000' } } }); 

    sheet.columns = [ 
     { header: 'Номер чека', key: 'cheque_number', width: 30 }, // & other columns 
    ]; 


    data.map(function(it) { 
     sheet.addRow({ 
     cheque_number: it.cheque_number, // & other data 
     }) 
    }); 

    res.writeHead(200, { 
     'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 
     'Content-Disposition': headerFilename, 
    }); 

    workbook.xlsx.write(res) 
)}; 

Dann habe ich nur noch einen Link in meinem html:


<a href='/export/all' rel='external' download> Export my file </a> 

... und es funktioniert perfekt. "Wie ein Charme", wie Sie gerne sagen:)

Ich hoffe, dass dies jemand helfen wird.

+0

Das ist eine ausgezeichnete Lösung, gutes Ergebnis! Sicherlich daran zu erinnern – Mikkel

+0

Danke, Mike! Alles Gute. –

+0

dies funktioniert nur für das Web, was ist mit mobilen Apps? –

Verwandte Themen