当前,我正在将图像文件从移动应用程序上传到服务器,然后从服务器上传到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
函数:https://github.com/jaydenseric/graphql-upload#readme
图像文件很大(3mb),即使使用Cloudfront,我也觉得它们需要很长时间才能加载到设备上。出于性能原因,我想在上传它们之前先压缩它们,以节省存储空间。有没有一种方法专门针对流?
答案 0 :(得分:1)
在这种情况下,我想一个名为sharp
的图书馆将是您的朋友。
我将在此处链接到该库,它广泛支持所有操作的流式传输。希望您能以此解决您的压缩操作。
关于您的性能因素,图书馆声称:
由于使用libvips,调整图像大小通常比使用最快的ImageMagick和GraphicsMagick设置快4-5倍。