Я новичок в загрузке в Google Cloud Bucket и у меня возникли проблемы с загрузкой PDF-документа в Google Cloud Bucket. Цель состоит в том, чтобы использовать PDFKit для создания PDF-документа, отправить его в Bucket, а затем ответить URL-адресом файла, который затем можно использовать на стороне клиента для загрузки файла.
В настоящее время файл загружается в корзину, но при попытке открыть его указывает, что он поврежден, как и файл, загружаемый из внешнего интерфейса.
Это метод создания, который у меня сейчас есть:
const PDFDocument = require('pdfkit');
const storage = require('./storage');
async function create(req, res) {
const doc_name = `invoice_${req.body.id}.pdf`;
const doc = new PDFDocument({
compress: false,
});
doc.fontSize(12);
doc.text('PDFKit is simple', 10, 30, {
align: 'center',
width: 200,
});
doc.end();
const fileId = await storage.upload(doc, req.account.id);
const url = await storage.getSignedURL(fileId, doc_name);
res.send(JSON.stringify({ doc: { url: url[0], name: doc_name } }));
}
module.exports = create;
Для загрузки файла используется следующее:
const { Storage } = require('@google-cloud/storage');
const moment = require('moment');
const stream = require('stream');
const uuidv4 = require('uuid/v4');
const storage = new Storage();
const bucket = storage.bucket(process.env.GOOGLE_STORAGE_BUCKET);
const fileSuffix = 'pdf';
const getBucketFile = fileName => bucket.file(`${fileName}.${fileSuffix}`);
const getSignedURL = (fileName, name) => {
const file = getBucketFile(fileName);
const config = {
action: 'read',
expires: moment()
.add(6, 'd')
.format('MM-DD-YYYY'),
responseDisposition: `inline; filename=${name}`,
};
return file.getSignedUrl(config);
};
const upload = (data, prefix) => new Promise((resolve, reject) => {
const uuid = `${prefix}/${uuidv4()}`;
const stream = require('stream');
const bufferStream = new stream.PassThrough();
bufferStream.end(Buffer.from(data.toString(), 'base64'));
const file = getBucketFile(uuid);
bufferStream
.pipe(file.createWriteStream())
.on('error', err => reject(err))
.on('finish', () => resolve(uuid));
});
module.exports = {
getSignedURL,
upload,
};
Я видел, как другие использовали firebase, но изо всех сил пытаюсь перевести на облако Google. Любая помощь будет высоко оценена!