Как загрузить файл Excel (кодировка utf-8 с помощью fs.createReadStream), используя Blob? - PullRequest
0 голосов
/ 01 марта 2020

Я успешно создаю файл excel с excel4node и сохраняю его на сервере, затем использую поток чтения для отправки файла клиенту:

            res.set({
                'Content-Type': 'application/vnd.openxmlformats',
                'Content-Disposition': 'attachment; filename='+filename
            });

            // This line opens the file as a readable stream
            var readStream = fs.createReadStream(path+filename, {encoding: 'utf8'});

            // This will wait until we know the readable stream is actually valid before piping
            readStream.on('open', function () {
                // This just pipes the read stream to the response object (which goes to the client)
                readStream.pipe(res);
            });
            // This catches any errors that happen while creating the readable stream (usually invalid names)
            readStream.on('error', function(err) {
            res.end(err);
            });

После этого я получаю данные в браузере и загрузить его с помощью Blob:

        var blob = new Blob([data], { type: 'application/vnd.openxmlformats' });
        var link = document.createElement('a');
        link.href = window.URL.createObjectURL(blob);
        link.download = "File.xlsx";

        document.body.appendChild(link);

        link.click();

        document.body.removeChild(link);

Когда я пытаюсь открыть файл, я получаю следующее сообщение:

"Excel found unreadable content in 'File.xlsx'. Do you want to recover the contents of this workbook? If you trust the source of this workbook, click Yes"

И если я нажимаю да, Excel говорит, что файл поврежден и не может быть восстановлено.

Я хотел бы знать, что я могу сделать, чтобы получить файл Excel с сервера.

1 Ответ

0 голосов
/ 02 марта 2020

Прочитав много постов, я нашел ответ здесь Как сохранить данные .xlsx в файл в виде большого двоичного объекта

Я должен закодировать поток как base64 в бэкэнде, используя 'base64-stream' и 'excel4node' .write функцию

wb.write(path+filename, function(err) {
                if (err) {
                    sails.log(err);
                } else {
                    // This line opens the file as a readable stream
                    var readStream = fs.createReadStream(path+filename);

                    // This will wait until we know the readable stream is actually valid before piping
                    readStream.on('open', function () {
                        // This just pipes the read stream to the response object (which goes to the client)
                        readStream.pipe(new Base64Encode()).pipe(res);
                    });
                    // This catches any errors that happen while creating the readable stream (usually invalid names)
                    readStream.on('error', function(err) {
                        res.end(err);
                    });
                }
            });

После этого я получил данные в браузере следующим образом:

.done(function(data){

      function s2ab(s) {
        var buf = new ArrayBuffer(s.length);
        var view = new Uint8Array(buf);
        for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
        return buf;
      }

        var blob = new Blob([s2ab(atob(data))], { type: 'application/vnd.openxmlformats' });
        var link = document.createElement('a');
        link.href = window.URL.createObjectURL(blob);
        link.download = "ExcelFile.xlsx";

        document.body.appendChild(link);

        link.click();

        document.body.removeChild(link);
    })

Проблема была в кодировке и даже если вы используете utf16le, файл не может быть прочитан Excel, так что это было лучшее решение, которое я нашел.

...