Meteor-Files与AWS S3集成指南打造可靠的云端文件存储解决方案【免费下载链接】Meteor-Files Upload files via DDP or HTTP to ☄️ Meteor server FS, AWS, GridFS, DropBox or Google Drive. Fast, secure and robust.项目地址: https://gitcode.com/gh_mirrors/me/Meteor-FilesMeteor-Files是一个稳定、快速且功能强大的Meteor.js文件管理包它利用MongoDB Collection API来简化文件上传、存储和删除等操作。通过将Meteor-Files与AWS S3集成您可以打造一个可靠、可扩展的云端文件存储解决方案满足现代应用对文件管理的高效需求。为什么选择Meteor-Files与AWS S3集成将Meteor-Files与AWS S3集成具有诸多优势。AWS S3提供了高度可扩展、安全且持久的对象存储服务能够轻松应对大量文件存储需求。而Meteor-Files则为Meteor应用提供了简洁易用的文件管理API使得开发者可以像操作MongoDB集合一样管理文件。两者结合能够为您的应用提供高效、可靠的云端文件存储体验。集成前的准备工作在开始集成Meteor-Files与AWS S3之前您需要完成以下准备工作安装必要的依赖包首先您需要安装AWS SDK用于与AWS S3进行交互。在项目根目录下执行以下命令npm install --save aws-sdk或者如果您使用的是Meteor的npm命令meteor npm install --save aws-sdk获取AWS S3访问凭证要使用AWS S3您需要获取相应的访问凭证。请按照以下步骤操作访问aws.amazon.com/s3并登录您的AWS账户。创建一个S3存储桶并选择合适的区域。常见的区域包括US Standard (默认):us-standardUS West (Oregon):us-west-2EU (Ireland):eu-west-1Asia Pacific (Tokyo):ap-northeast-1创建一个具有适当权限的IAM用户获取Access Key Id和Secret Key。确保该用户具有s3:DeleteObject权限以便能够从S3中删除文件。配置Meteor-Files与AWS S3集成创建设置文件创建一个settings.json文件并在其中添加AWS S3的配置信息{ s3: { key: AWSKEY, secret: AWSSECRET, bucket: BUCKETNAME, region: us-west-1 } }使用以下命令启动Meteor应用时加载此设置文件meteor --settings settings.json使用环境变量设置配置除了使用settings.json文件外您还可以通过环境变量来设置AWS S3的配置。例如import { Meteor } from meteor/meteor; /** env.var example: S3{s3:{key: xxx, secret: xxx, bucket: xxx, region: xxx}} **/ if (process.env.S3) { Meteor.settings.app.s3 JSON.parse(process.env.S3).s3; }实现文件上传到AWS S3创建一个服务器端文件例如Server-side-file-store.js并将其放置在Meteor的imports/server目录下。以下是实现文件上传到AWS S3的核心代码import { Meteor } from meteor/meteor; import { _ } from meteor/underscore; import { Random } from meteor/random; import { FilesCollection } from meteor/ostrio:files; import fs from node:fs; import S3 from aws-sdk/clients/s3; // 检查并加载AWS S3配置 if (process.env.S3) { Meteor.settings.app.s3 JSON.parse(process.env.S3).s3; } const s3Conf Meteor.settings.app.s3 || {}; // 验证配置是否完整 if (!s3Conf || !s3Conf?.key || !s3Conf?.secret || !s3Conf?.bucket || !s3Conf?.region) { throw new Meteor.Error(401, Missing Meteor file settings); } // 创建S3对象 const s3 new S3({ secretAccessKey: s3Conf.secret, accessKeyId: s3Conf.key, region: s3Conf.region, httpOptions: { timeout: 6000, agent: false } }); // 创建Meteor文件集合 const UserFiles new FilesCollection({ debug: false, storagePath: assets/app/uploads/uploadedFiles, collectionName: userFiles, allowClientCode: false, // 上传完成后将文件移动到AWS S3 onAfterUpload(fileRef) { for(let version in fileRef.versions) { if (!fileRef.versions[version]) continue; const vRef _.clone(fileRef.versions[version]); const filePath files/${Random.id()}-${version}.${fileRef.extension}; const stream fs.createReadStream(vRef.path); s3.putObject({ StorageClass: STANDARD, Bucket: s3Conf.bucket, Key: filePath, Body: stream, ContentType: vRef.type, }, async (error) { if (error) { console.error([afterUpload] [putObject] Error:, fileRef._id, error); return; } try { await this.collection.updateAsync({ _id: fileRef._id }, { $set: { [versions.${version}.meta.pipePath]: filePath } }); await this.unlinkAsync(fileRef, version); } catch (_unlinkError) { s3.deleteObject({ Bucket: s3Conf.bucket, Key: filePath, }, (deleteError) { if (deleteError) { console.error([afterUpload] [deleteObject] Error:, fileRef._id, deleteError); } }); } }); } }, // 从S3删除文件 onAfterRemove(docs) { for (let i docs.length - 1; i 0; i--) { if (docs[i].versions) { for (let version in docs[i].versions) { if (docs[i].versions[version]?.meta?.pipePath) { s3.deleteObject({ Bucket: s3Conf.bucket, Key: docs[i].versions[version].meta.pipePath, }, (error) { if (error) { console.error([onAfterRemove] [deleteObject] Error:, error); } }); } } } } return (docs.length 1 docs[0].versions.original?.meta?.pipePath); }, // 拦截下载请求重定向到S3 interceptDownload(http, fileRef, version) { const path fileRef?.versions[version]?.meta?.pipePath; if (!path) return false; const opts { Bucket: s3Conf.bucket, Key: path }; if (http.request.headers.range) { // 处理范围请求 const vRef fileRef.versions[version]; const range http.request.headers.range; const array range.split(/bytes([0-9]*)-([0-9]*)/); const start parseInt(array[1]); let end parseInt(array[2]) || (start this.chunkSize) - 1; if (end vRef.size) end vRef.size - 1; opts.Range bytes${start}-${end}; http.request.headers.range bytes${start}-${end}; } const awsStream s3.getObject(opts).createReadStream(); awsStream.on(error, () { if (!http.response.finished) http.response.end(); }); this.serve(http, fileRef, fileRef.versions[version], version, awsStream); return true; } });利用AWS Lambda进行图片处理Meteor-Files与AWS S3集成后您还可以利用AWS Lambda实现图片的自动处理。例如当有新图片上传到S3时自动生成缩略图。创建Lambda函数登录AWS控制台进入Lambda服务页面。创建一个新的Lambda函数添加S3触发器选择您的存储桶并设置触发事件为Object Created(All)。编写Lambda函数代码实现图片处理逻辑。以下是一个使用ImageMagick进行图片缩放的示例const async require(async); const AWS require(aws-sdk); const gm require(gm).subClass({ imageMagick: true }); const path require(path); const WEB_WIDTH_MAX 420; const WEB_Q_MAX 85; const FOLDER_DEST thumb/; AWS.config.update({ accessKeyId: xxxxxxxxxxx, secretAccessKey: xxxxxxxxxxxxxxxxxxxx }); const s3 new AWS.S3(); exports.handler (event, context, callback) { const srcBucket event.Records[0].s3.bucket.name; const srcKey decodeURIComponent(event.Records[0].s3.object.key.replace(/\/g, )); const imageName path.basename(srcKey); const typeMatch srcKey.match(/\.([^.]*)$/); if (!typeMatch || ![jpg, jpeg, png].includes(typeMatch[1].toLowerCase())) { callback(Unsupported image type); return; } async.waterfall([ function download(next) { s3.getObject({ Bucket: srcBucket, Key: srcKey }, next); }, function transform(response, next) { gm(response.Body) .resize(WEB_WIDTH_MAX) .quality(WEB_Q_MAX) .strip() .toBuffer(jpg, (err, buffer) { if (err) return next(err); next(null, response, buffer); }); }, function upload(response, buffer, next) { const dstKey FOLDER_DEST imageName; s3.putObject({ Bucket: srcBucket, Key: dstKey, Body: buffer, ContentType: response.ContentType, CacheControl: max-age864000 }, (err) { if (err) return next(err); next(null); }); } ], (err) { if (err) console.error(Error processing image:, err); else console.log(Image processed successfully); callback(null); }); };配置Lambda函数依赖创建一个package.json文件列出Lambda函数所需的依赖{ name: amazon-lambda-resizer, version: 0.0.1, dependencies: { async: ^2.6.0, aws-sdk: ^2.240.1, gm: ^1.23.1, path: ^0.12.7 } }安装依赖后将函数代码和node_modules文件夹一起压缩上传到Lambda控制台。总结通过本文的指南您已经了解了如何将Meteor-Files与AWS S3集成实现可靠的云端文件存储解决方案。从准备工作到配置集成再到利用AWS Lambda进行图片处理我们涵盖了整个流程的关键步骤。Meteor-Files提供了丰富的API和灵活的钩子机制使得与第三方存储服务的集成变得简单。结合AWS S3的强大功能您的应用可以轻松应对各种文件存储需求为用户提供高效、可靠的文件管理体验。如果您想深入了解Meteor-Files的更多功能可以查阅官方文档docs/readme.md。对于AWS S3集成的详细信息也可以参考docs/aws-s3-integration.md。希望本文能够帮助您顺利实现Meteor-Files与AWS S3的集成打造出更加出色的应用【免费下载链接】Meteor-Files Upload files via DDP or HTTP to ☄️ Meteor server FS, AWS, GridFS, DropBox or Google Drive. Fast, secure and robust.项目地址: https://gitcode.com/gh_mirrors/me/Meteor-Files创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考