Konwersja i przesyłanie pliku

0

Witam,
od kilku godzin borykam się z pewnym problemem. Mianowicie próbuję przesłać plik docx na serwer i tam przy użyciu easy-template-x podmienić jego dane. Koduję go na base64, a na serwerze odkodowuję na Buffer. Jednak pojawia mi się w konsoli serwera błąd:
MalformedFileError: Malformed file detected. Make sure the file is a valid docx file.

Funkcja, która obsługuje dodanie pliku (React.js)

function handleTemplateUpload(e) {
		const file = e.target.files[0];
		const reader = new FileReader();

		reader.onload = (event) => {
			const base64String = btoa(event.target.result);
			dispatch(updateTemplate(base64String));
		};

		reader.readAsBinaryString(file);
	}

Funkcja axios, która wysyła dane na serwer (React.js)

axios
			.post('http://localhost:3001/generatePreview', JSON.stringify({template: template, data: xlsxJson}), {
				headers: {
					'Content-Type': 'application/json',
				},
			})
			.then((response) => {
				console.log(response.data);
			})
			.catch((error) => console.log(error));

I punkt końcowy do zastępywania danych:

const {TemplateHandler} = require('easy-template-x');

const generatePreview = async (req, res) => {
	const template = req.body.template;
	const data = req.body.data;
	const buffer = Buffer.from(template, 'base64').toString();

	const handler = new TemplateHandler();
	const doc = await handler.process(buffer, data[2]);

	res.send(doc);
};

module.exports = generatePreview;

Dokładny komunikat błędu:

MalformedFileError: Malformed file detected. Make sure the file is a valid docx file.
    at TemplateHandler.loadDocx (C:\Users\Victor\Desktop\mama\server\node_modules\easy-template-x\dist\cjs\easy-template-x.js:3141:13)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async TemplateHandler.process (C:\Users\Victor\Desktop\mama\server\node_modules\easy-template-x\dist\cjs\easy-template-x.js:3051:18)
    at async generatePreview (C:\Users\Victor\Desktop\mama\server\src\controllers\generatePreview.js:11:14) {
  expectedFileType: 'docx'
}

Dokumentacja easy-template-x: https://www.npmjs.com/package/easy-template-x

0

Trzeba by ustalić, w którym miejscu dokładnie pojawia się błąd.

const base64String = btoa(event.target.result);

czy na tym etapie wszystko się zgadza? Czy event.target.result zawiera dane binarne? W MDN pod artykułem readAsBinaryString radzą, że lepiej używać readAsArrayBuffer
https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsArrayBuffer

const buffer = Buffer.from(template, 'base64').toString();

czy na tym etapie template to faktycznie base64?

const doc = await handler.process(buffer, data[2]);

albo tutaj - co masz pod doc? czym jest data?

no i z opisu błędu wynika, że błąd jest gdzieś w TemplateHandler.loadDocx(nie wołasz tego bezpośrednio?) i podaje ci numer linijki w pliku w node_modules, tam też warto zajrzeć, do źródła tej biblioteki, jakie dokładnie założenie ta biblioteka czyni i co robi, że ci zwraca błąd.

w repo na GH można wyczytać, że biblioteka rzuca taki błąd wtedy, kiedy nie podajesz zipa
https://github.com/alonrbar/easy-template-x/search?q=MalformedFileError
(docx zdaje się to już jest format oparty na zzipowanym XMLu https://en.wikipedia.org/wiki/Office_Open_XML )
chociaż tu dochodzimy do punktu wyjścia, że podajesz nieprawidłowe dane gdzieś

1 użytkowników online, w tym zalogowanych: 0, gości: 1