CarpKoi
@CarpKoi

Как отправить сгенерированный на сервере файл и скачать его на клиенте?

На HTML-странице размещена форма, данные из которой через клиентский JS отправляются на сервер. На сервере данные обрабатываются, и исходя из их значений создается определенный docx-файл. Этот сгенерированный файл отправляется обратно клиенту на скачивание.

Клиентская и серверная часть написаны на JavaScript. Для создания документа на сервере используется модуль DOCX.js.

Клиентская часть:
$(document).on('click', '#btnCreate', function (event) {
  event.preventDefault();
  
  var xhr = new XMLHttpRequest();
  xhr.open('POST', '/postCreateDoc', true);
  xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
  xhr.onload = function(){
    /*Обработка полученного файла, отправка файла на загрузку*/
  };
  var kindDoc = $('#typeDoc').val(); /*Получение данных из Select*/
  var userName = $('#userName').val(); /*Получение данных из Input*/
  var data = JSON.stringify([kindDoc, userName]);
  xhr.send(data);
});


Серверная часть:
var docx = require('docx');
var express = require('express');
var app = express();

/*Обработка других запросов*/

app.post('/postCreateDoc', function(req,res){
    const chunks = [];
    req.on('data', chunk => chunks.push(chunk));
    req.on('end', () => {
        var data = Buffer.concat(chunks);
        data = JSON.parse(data);
        /*Обработка полученных данных*/
        /*Для примера привожу создание абзаца в WORD-документе:*/
        var doc = new docx.Document(); /*Создание документа*/
        var p1 = new docx.Paragraph('Текст-текст-текст-текст'); /*Создание параграфа(абзаца) с текстом*/
        doc.addParagraph(p1); /*Добавление параграфа в документ*/
        /*Отправка файла*/
    });
});


Меня интересуют непосредственно вопросы: какой код надо прописать в серверной части, чтобы отправить сгенерированный docx-файл клиенту, и какой код надо прописать в клиентской части, чтобы этот файл отправить на загрузку. Не обязательно примеры с фалами формата .doc(x)... Думаю, пойдут примеры и с обычными .txt файлами.

---
.doc-файл через XAML и HTML создавала. Проблема в том, что при из последующем изменении этого документа на компьютере в каталоге создавалась папка <имя документа>.files со XAML-файлами. По этой причине использую модуль в серверной части.
Создание документа на клиентской части, как здесь, не рассматриваю. Я лишь в пример привела такой простой код по созданию файла.
  • Вопрос задан
  • 651 просмотр
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега JavaScript
{PHP, MySql, HTML, JS, CSS} developer
Заголовки отправьте правильные, этого достаточно.
в ноде не силен, в пхп примерно так:
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
 header('Cache-Control: no-store, no-cache, must-revalidate');
 header('Cache-Control: post-check=0, pre-check=0', FALSE);
 header('Pragma: no-cache');
 header('Content-transfer-encoding: binary');
 header('Content-Disposition: attachment; filename=some.docx');
 header('Content-Type: application/msword');
 echo $contentOfWordDoc;


...чтобы этот файл отправить на загрузку.

а это для чего и зачем?

Проблема в том, что при из последующем изменении этого документа на компьютере в каталоге создавалась папка <имя документа>.files со XAML-файлами.
при сохранении такого файла по умолчанию ворд пытается сохранить его как хтмл, достаточно выставить нужный вам тип документа в селекторе типов при сохранении (docx например).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы