sql >> Databáze >  >> NoSQL >> Redis

Jak přimět klienta ke stažení velmi velkého souboru, který je generován za běhu

Excel Export:

Použijte streamy. Následuje přibližná představa o tom, co lze udělat:

  1. Použijte modul exceljs. Protože má streamovací API zaměřené přesně na tento problém.

    var Excel = require('exceljs')
    
  2. Protože se pokoušíme zahájit stahování. Napište vhodná záhlaví pro odpověď.

    res.status(200);
    res.setHeader('Content-disposition', 'attachment; filename=db_dump.xls');
    res.setHeader('Content-type', 'application/vnd.ms-excel');
    
  3. Vytvořte sešit podporovaný aplikací Streaming Excel Writer. Stream předaný zapisovači je odpověď serveru.

    var options = {
        stream: res, // write to server response
        useStyles: false,
        useSharedStrings: false
    };
    
    var workbook = new Excel.stream.xlsx.WorkbookWriter(options);
    
  4. Nyní je tok výstupního streamování vše nastaven. pro streamování vstupu preferujte ovladač DB, který poskytuje výsledky dotazu/kurzor jako proud.

  5. Definujte asynchronní funkci, která vypíše 1 tabulku do 1 listu.

    var tableToSheet = function (name, done) {
        var str = dbDriver.query('SELECT * FROM ' + name).stream();
        var sheet = workbook.addWorksheet(name);
    
        str.on('data', function (d) {
            sheet.addRow(d).commit(); // format object if required
        });
    
        str.on('end', function () {
            sheet.commit();
            done();
        });
    
        str.on('error', function (err) {
            done(err);
        });
    }
    
  6. Nyní pojďme exportovat některé db tabulky pomocí asynchronního modulu mapSeries:

    async.mapSeries(['cars','planes','trucks'],tableToSheet,function(err){
       if(err){
         // log error
       }
       res.end();
    })
    

Export CSV:

Pro CSV export jedné tabulky/kolekčního modulu lze použít fast-csv:

// response headers as usual
res.status(200);
res.setHeader('Content-disposition', 'attachment; filename=mytable_dump.csv');
res.setHeader('Content-type', 'text/csv');

// create csv stream
var csv = require('fast-csv');
var csvStr = csv.createWriteStream({headers: true});

// open database stream
var dbStr = dbDriver.query('SELECT * from mytable').stream();

// connect the streams
dbStr.pipe(csvStr).pipe(res);

Nyní streamujete data z DB do HTTP odpovědi a za běhu je převádíte do formátu xls/csv. Není třeba ukládat do vyrovnávací paměti nebo ukládat celá data do paměti nebo do souboru.



  1. Jak používat Redis s Pythonem

  2. Mongo převede všechna číselná pole, která jsou uložena jako řetězec

  3. Nelze se připojit k mongodb pomocí IP počítače

  4. Hledání klíčů pomocí zástupných znaků