Загрузите файл PDF в Google Cloud Storage с помощью Node.js - PullRequest
0 голосов
/ 02 июля 2019

Я новичок в загрузке в 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. Любая помощь будет высоко оценена!

...