#node.js #express #flutter
#node.js #экспресс #flutter
Вопрос:
У меня есть код nodejs, с помощью которого я могу загрузить PDF-файл из браузера, когда я отправляю 2 аргумента в запросе post: fname и lname.
Я использую пакет express и pdfmake в серверной части.
const express = require('express');
const router = express.Router();
const pdfMake = require('../pdfmake/pdfmake');
const vfsFonts = require('../pdfmake/vfs_fonts');
pdfMake.vfs = vfsFonts.pdfMake.vfs;
router.post('/pdf', (req, res, next) => {
//res.send('PDF');
const fname = req.body.fname;
const lname = req.body.lname;
var documentDefinition = {
content: [{
image: 'data:image/png;base64 more code',
width: 200,
alignment: 'center'
},
{ text: 'nGrupo de inspecciones predictivas', style: 'header', alignment: 'center' },
{ text: 'Reporte de inspecciónnn', style: 'subheader', alignment: 'center' },
'El siguiente reporte tiene como objetivo describir los resultados encontrados a partir de la inspección en la fecha específica.',
{ text: 'Resumen del reporte', style: 'subheader' },
{
style: 'tableExample',
table: {
widths: ['*', 'auto'],
body: [
['Inspector:', { text: `${ fname }`, noWrap: true }],
['Flota:', { text: '', noWrap: true }],
['Número de flota:', { text: '', noWrap: true }],
['Técnica:', { text: '', noWrap: true }],
['Fecha de inicio:', { text: '', noWrap: true }],
]
}
},
],
styles: {
header: {
fontSize: 18,
bold: true,
margin: [0, 0, 0, 10]
},
subheader: {
fontSize: 16,
bold: true,
margin: [0, 10, 0, 5]
},
tableExample: {
margin: [0, 5, 0, 15]
},
tableHeader: {
bold: true,
fontSize: 13,
color: 'black'
}
},
defaultStyle: {
// alignment: 'justify'
}
};
const pdfDoc = pdfMake.createPdf(documentDefinition);
pdfDoc.getBase64((data) => {
res.writeHead(200, {
'Content-Type': 'application/pdf',
'Content-Disposition': 'attachment;filename="filename.pdf"'
});
const download = Buffer.from(data.toString('utf-8'), 'base64');
res.end(download);
});
});
Однако, как я упоминал выше, этот код, по-видимому, возвращает только de pdf в браузеры.
Мне нужно загрузить PDF-файл в хранилище Android / IOS в приложении Flutter.
Ответ №1:
Хорошим способом добиться этого было бы создать простую конечную точку URL, которая возвращает файл напрямую. В вашем приложении flutter вы можете использовать file downloader для загрузки файла непосредственно в приложение, используя что-то вроде этого:
final taskId = await FlutterDownloader.enqueue(
url: 'your download link',
savedDir: 'the path of directory where you want to save downloaded files',
showNotification: true, // show download progress in status bar (for Android)
openFileFromNotification: true, // click on notification to open downloaded file (for Android)
);
Вы можете найти подробную информацию о том, как настроить конечную точку для этого здесь.
Комментарии:
1. Доброе утро, мистер Эш. Спасибо за ответ. Я хотел найти способ сделать это с помощью NodeJS, а не как загрузить его с flutter. Но я ценю это, я уверен, что собираюсь использовать его в следующий раз.
Ответ №2:
Я использовал облачную платформу Google для хранения PDF, сгенерированного NodeJS. Вы можете сделать это, следуя следующим статьям:https://mzmuse.com/blog/how-to-upload-to-firebase-storage-in-node
https://github.com/googleapis/google-cloud-node/issues/2334
pdfDoc.getBase64((data) => {
const keyFilename = "./myGoogleKey.json";
const projectId = "my-name-project";
const bucketName = `${projectId}.appspot.com`;
var GoogleCloudStorage = require('@google-cloud/storage');
const gcs = GoogleCloudStorage({
projectId,
keyFilename
});
const bucket = gcs.bucket(bucketName);
const gcsname = 'reporte.pdf';
const file = bucket.file(gcsname);
var buff = Buffer.from(data.toString('utf-8'), 'base64');
const stream = file.createWriteStream({
metadata: {
contentType: 'application/pdf'
}
});
stream.on('error', (err) => {
console.log(err);
});
stream.on('finish', () => {
console.log(gcsname);
});
stream.end(buff);
res.status(200).send('Succesfully.');
});
});
Это сгенерирует URL-адрес, и вы можете следовать последнему ответу, данному Esh выше.