Запрос файла csv для загрузки в виде всплывающего окна с использованием node.js и node-csv-parser (модуль узла)

Недавно я начал работать с node.js. Выполняя требование в одном из моих проектов, я столкнулся с проблемой, когда я должен иметь возможность динамически записывать некоторые данные в файл csv и позволять пользователю запрашивать всплывающее окно для загрузки (с параметрами сохранения и отмены - как мы обычно видеть). Погуглив какое-то время, я решил использовать модуль csv npm https://github.com/wdavidw/node-csv-parser. Я могу записывать данные в файл и сохранять их с помощью этого модуля. Я хочу вызвать всплывающее окно для сохранения этого файла с/без сохранения файла.

мой код выглядит примерно так:

    // Sample Data 
    var data = [["id", "subject1", "subject2", "subject3"], ["jack", 85, 90, 68], ["sam", 77, 89, 69]]

    // Server Side Code    
    var csv = require('../../node_modules/csv');            
    var fs = require('fs');

    createCSV = function(data, callback) {
        csv().from(data).to(fs.createWriteStream('D:/test.csv')) // writing to a file           
    }

    // Client side call sample
    $("#exportToCSV").click(function() {
        callToServer.createCSV(data);
       return false;
    });

Это работает хорошо, когда речь идет о записи файла csv.

  • Я хочу предложить этот файл немедленно загрузить для пользователей.
  • Если это можно сделать без сохранения файла, будет здорово.
  • Как я могу установить тип содержимого и расположение содержимого, как мы это делаем в PHP

Любая помощь приветствуется. -Спасибо


person Manish Kumar    schedule 25.10.2012    source источник


Ответы (5)


Ответ Маниша Кумара точен - он просто хотел включить вариант синтаксиса Express 4 для достижения этой цели:

function(req, res) {
  var csv = GET_CSV_DATA // Not including for example.

  res.setHeader('Content-disposition', 'attachment; filename=testing.csv');
  res.set('Content-Type', 'text/csv');
  res.status(200).send(csv);

}
person joel.bowen    schedule 06.11.2015
comment
Я чувствую, что смешивание setHeader с set сбивает с толку и непоследовательно. Несмотря на то, что они делают одно и то же, они происходят из разных мест. Использование setHeader() исходит из модуля NodeJS http. Если вы используете res.set, это из среды Express; он позволяет установить несколько заголовков, если вы дадите ему объект: res.set({ 'Content-Disposition': 'attachment; filename=testing.csv', 'Content-Type': 'text/csv' }) - person nbkhope; 23.03.2018

Я сделал это примерно так:

http.createServer(function(request, response) {
    response.setHeader('Content-disposition', 'attachment; filename=testing.csv');
    response.writeHead(200, {
        'Content-Type': 'text/csv'
    });

    csv().from(data).to(response)

})
.listen(3000);
person Manish Kumar    schedule 08.11.2012
comment
Просто примечание: как только вы закончите приведенный выше серверный код, свяжите свой клиентский адрес location.href с URL-адресом запроса узла [нет необходимости в вызове ajax]. - person vinod; 08.09.2015
comment
Краткое примечание о синтаксисе для Express 4: res.setHeader('Content-disposition', 'attachment; filename=testing.csv'); res.set('Тип содержимого', 'текст/csv'); res.status(200).send(csv); - person joel.bowen; 06.11.2015
comment
без библиотеки csv и без экспресса вместо строки csv() можно сделать response.write(myCSVText); ответ.конец(); - person ABCD.ca; 21.07.2016

Следующее решение предназначено для Express

Express развивается, вместо установки заголовка типа вложения и контента, напрямую используйте API вложения http://expressjs.com/4x/api.html#res.attachment

Примечание: вложение() не передает файл, оно просто устанавливает имя файла в заголовке.

response.attachment('testing.csv');
csv().from(data).to(response);
person Palani    schedule 16.06.2014

Express-csv — отличный модуль для записи содержимого csv в поток с сервера node.js, который будет отправлен в качестве ответа клиенту (и загружен в виде файла). Очень прост в использовании.

app.get('/', function(req, res) {
  res.csv([
    ["a", "b", "c"]
  , ["d", "e", "f"]
  ]);
});

Документы: https://www.npmjs.com/package/express-csv.

Когда вы передаете объект, вам нужно явно добавить заголовки (если вы этого хотите). Вот мой пример с использованием npm mysql

router.route('/api/report')
    .get(function(req, res) {
            query = connection.query('select * from table where table_id=1;', function(err, rows, fields) {
                if (err) {
                    res.send(err);
                }
                var headers = {};
                for (key in rows[0]) {
                    headers[key] = key;
                }
                rows.unshift(headers);
                res.csv(rows);
            });
    });
person Federico    schedule 09.02.2015

Проверьте этот ответ: Nodejs отправляет файл в ответ

По сути, вам не нужно сохранять файл на жесткий диск. Вместо этого попробуйте отправить его непосредственно в response. Если вы используете что-то вроде Express, это будет выглядеть примерно так:

var csv = require('csv');
req.get('/getCsv', function (req, res) {
    csv().from(req.body).to(res);
});
person Max    schedule 25.10.2012
comment
Я не использую экспресс, а просто пользовательский фреймворк node.js. - person Manish Kumar; 26.10.2012
comment
В любом случае модуль http отвечает на запросы обратными вызовами с теми же параметрами, function (request, response). Я думаю, вы должны иметь возможность отправлять результаты CSV непосредственно в response. - person Max; 26.10.2012