最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

NodeJS:在上传到S3之前如何压缩流?

运维笔记admin9浏览0评论

NodeJS:在上传到S3之前如何压缩流?

NodeJS:在上传到S3之前如何压缩流?

目前,我正在将图像文件从移动应用程序上传到服务器,然后从服务器上传到S3。像这样:

updateProgressPics: combineResolvers(
  isAuthenticated,
  async (parent, { pics }, { models, currentUser }) => {
    return pics.map(async (pic, i) => {
      const { file, filename, progressPicId } = pic;
      const { createReadStream } = await file;
      const stream = createReadStream();

      const { Location: url, Key: key, Bucket: bucket } = await S3.upload({
        stream,
        filename,
        folder: currentUser.id,
      });

      return await models.ProgressPic.findOneAndUpdate(
        { _id: progressPicId },
        { $set: { url, key, bucket } },
        { new: true, useFindAndModify: false }
      );
    });
  }

我的S3文件:

import AWS from "aws-sdk";
import fs from "fs";

import { AWS_CONFIG, S3_BUCKET } from "../../config";

AWS.config.update(AWS_CONFIG);

const s3 = new AWS.S3();

export const upload = async ({ folder, filename, stream }) => {
  const params = {
    Bucket: S3_BUCKET,
    Key: `${folder}/${filename}`,
    Body: stream,
  };

  const options = { partSize: 10 * 1024 * 1024, queueSize: 1 };

  return s3.upload(params, options).promise();
};

export default {
  upload,
};

我正在使用Graphql上传,它公开了createReadStream函数:

图像文件很大(3mb),即使使用Cloudfront,我也觉得它们需要很长时间才能加载到设备上。出于性能原因,我想在上传它们之前先压缩它们,以节省存储空间。有没有一种方法专门针对流?

回答如下:

我想在这种情况下,一个名为sharp的库将是您的朋友。我将在此处链接到该库,它广泛支持所有操作的流式传输。希望您能以此解决您的压缩操作。

  • 来源:https://github/lovell/sharp
  • 文档:https://sharp.readthedocs.io/en/stable/

关于您的性能因素,该库要求调整大小:

...由于使用libvips,通常比使用最快的ImageMagick和GraphicsMagick设置快4到5倍。

发布评论

评论列表(0)

  1. 暂无评论