簡體   English   中英

使用 Node.js 將 pdf 文件上傳到 Google Cloud Storage

[英]Upload a pdf file to Google Cloud Storage with Node.js

我是上傳到 Google Cloud Bucket 的新手,並且在將 pdf 文檔上傳到 Google Cloud Bucket 時遇到了問題。 目的是使用 PDFKit 創建一個 pdf 文檔,將其發送到 Bucket,然后以文件的 url 響應,然后可以在客戶端使用該 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,但正在努力轉換為谷歌雲。 任何幫助將不勝感激!

我已修改您上傳到適合我的版本:

const { Storage } = require("@google-cloud/storage");
const { v4: uuidv4 } = require("uuid");
const bucketName = require("../config/endpoints").BUCKETNAME;

const storage = new Storage();

const bucket = storage.bucket(bucketName);
const fileSuffix = "pdf";

const getBucketFile = fileName => 
   bucket.file(`${fileName}.${fileSuffix}`);
const getSignedURL = async fileName => {
  let validTime = new Date();
  validTime.setHours(validTime.getHours() + 1);
  const config = {
    version: "v4",
    action: "read",
    expires: validTime
  };

  const signedUrl = await storage
     .bucket(bucketName)
     .file(fileName)
     .getSignedUrl(config);
  return signedUrl;
};

const upload = (data) =>
   new Promise((resolve, reject) => {
   const uuid = `pdf/${uuidv4()}`;
   const file = getBucketFile(uuid);
   const stream = file.createWriteStream({
     metadata: {
       "Content-Type": "application/pdf",
       "content-Disposition": `attachment; filename=${uuid}.pdf`
     },
     resumable: false
   });
   stream.on("error", err => {
      reject(error);
   }); 

   stream.on("finish", () => {
     resolve(uuid);
   });

   stream.end(Buffer.from(data.toString(), "binary"));
 });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM