Nodejs、multer、aws S3

2024-03-26

如何应用 uuid 和日期,以便存储在数据库中的文件名和存储在 S3 存储桶中的文件名相同?

在当前的实现中,即使帖子是在几小时后发布的,uuid 和日期也始终相同。

有人可以帮忙吗,真的很感激。

const s3 = new AWS.S3({
 accessKeyId: process.env.AWS_ID,
 secretAccessKey: process.env.AWS_SECRET,
 region:process.env.AWS_REGION
 })

const uid =uuidv4();
const date =new Date().toISOString()

const multerS3Config = multerS3({
      s3: s3,
      bucket: process.env.AWS_BUCKET,
      metadata: function (req, file, cb) {
               cb(null, { fieldName: file.fieldname }); },
      shouldTransform: true,
      acl: 'public-read',
      contentType: multerS3.AUTO_CONTENT_TYPE,
      transforms: [
                  {
                    id: 'full',
                    key: (req, file, cb) => cb(null, file.originalname 
                         + "-"  + `${date}` + "-" + `${uid}` + 
                         "_full.jpg"),
                    transform: (req, file, cb) => cb(null, 
                               sharp().resize(2000).jpeg({ 
                               quality: 50 }))
                   },
                   {
                     id: 'thumb',
                     key: (req, file, cb) => cb(null, 
                          file.originalname + "-"  + 
                          `${date}` + "-" + `${uid}` + "_thumb.jpg"),
                     transform: (req, file, cb) => cb(null, 
                                sharp().resize(100).jpeg({ 
                                quality: 30 }))
                   },
                   ],
                });

const upload = multer({
storage: multerS3Config,
limits: { fieldSize: 25 * 1024 * 1024 },
});

这是我的帖子请求

router.post(
"/",
 [    upload.array("images", config.get("maxImageCount"))],
 async (req, res) => {
const paths = await req.files.map((file) => ({ originalName: file.originalname + "-" + 
`${date}` 
+ "-" + `${uid}`}));
await Post.create({
title: req.body.title,
userId: req.body.userId,
Post_Images: paths.map((x) => ({ images: x.originalName })),
},
{ 
include: [Post_Image] }).then(
res.status(201).send())

通过当前的实现,文件将存储在 db 和 s3 中。

另外,我的另一个问题是使用 multer 和 multer-s3 有什么区别?我尝试使用 multer 将图像发布到 s3,但它不起作用,所以我使用 multer-s3 并且它起作用了。

UPDATE

 const s3 = new AWS.S3({
 accessKeyId: process.env.AWS_ID,
 secretAccessKey: process.env.AWS_SECRET,
 region:process.env.AWS_REGION
 })

function getFilename() {
return new Date().toISOString() + '-' + uuidv4();
}

function getTransforms() {
const fileName = getFilename();
return {
transforms:[
  {
      id: 'full',
      key: (req, file, cb) => {
        let fname = file.originalname.split(".");
        cb(null, fname[0] + '-' + fileName + "_full.jpg")},
      transform: (req, file, cb) => cb(null,
          sharp().resize(2000).jpeg({
              quality: 50
          }))
  },
  {
      id: 'thumb',
      key: (req, file, cb) => {
        let fname = file.originalname.split(".");
        cb(null, fname[0] + '-' + fileName + "_thumb.jpg")},
      transform: (req, file, cb) => cb(null,
          sharp().resize(100).jpeg({
              quality: 30
          }))
  }
  ],
metadata: (req, file, cb) => {
let fname = file.originalname.split(".");
cb(null, { 
    fieldName: file.fieldname, 
    key: fname[0] + '-' + fileName
});
}}}

const multerS3Config = multerS3({
      s3: s3,
      bucket: process.env.AWS_BUCKET,
      shouldTransform: true,
      acl: 'public-read',
      contentType: multerS3.AUTO_CONTENT_TYPE,
      ...getTransforms()
      });

const upload = multer({
storage: multerS3Config,
limits: { fieldSize: 25 * 1024 * 1024 },
});

这是我的帖子请求

router.post(
"/",
 [    upload.array("images", config.get("maxImageCount"))],
 async (req, res) => {

const paths = await req.files.map((file) => ({ images: 
              file.transforms[0].metadata.key}));

await Post.create({
title: req.body.title,
userId: req.body.userId,
Post_Images: paths,
},
{ 
include: [Post_Image] }).then(
res.status(201).send())

我的问题是the date and uuid variables both will initialize when node server start, it never changes until your node server restarts


快速修复:

  • 保持不变
const s3 = new AWS.S3({
    accessKeyId: process.env.AWS_ID,
    secretAccessKey: process.env.AWS_SECRET,
    region: process.env.AWS_REGION
});
  • the date and uuid变量都将在节点服务器启动时初始化,直到节点服务器重新启动为止它永远不会改变,您只需将其放入函数中以每次返回新文件名,
  • 这里函数返回除扩展名之外的文件名
function getFilename() {
    return new Date().toISOString() + '-' + uuidv4();
}
  • 创建转换函数并在两个版本中传递相同的文件名getFilename()函数,也在元数据中添加文件名,
function getTransforms() {
    const fileName = getFilename();
    return {
        transforms: [
            {
                id: "full",
                key: (req, file, cb) => {
                    let fname = file.originalname.split(".")
                    cb(null, fname[0] + '-' + fileName + "_full.jpg")
                },
                transform: (req, file, cb) => cb(null, sharp().resize(2000).jpeg({ quality: 50 }))
            },
            {
                id: "thumb",
                key: (req, file, cb) => {
                    let fname = file.originalname.split(".")
                    cb(null, fname[0] + '-' + fileName + "_thumb.jpg")
                },
                transform: (req, file, cb) => cb(null, sharp().resize(100).jpeg({ quality: 30 }))
            }
        ],
        metadata: (req, file, cb) => {
            let fname = file.originalname.split(".");
            cb(null, { 
                fieldName: file.fieldname, 
                key: fname[0] + '-' + fileName + ".jpg"
            });
        }
    }
}
  • call getTransforms()函数,它将返回转换和元数据属性
  • 我不确定您是否登录以将文件名存储在数据库中,
  • 得到名字来自transfoems.metadata我们从元数据传递的,这将仅返回 _full name,
router.post("/", async (req, res) => {

    const multerS3Config = multerS3({
        s3: s3,
        bucket: process.env.AWS_BUCKET,
        shouldTransform: true,
        acl: 'public-read',
        contentType: multerS3.AUTO_CONTENT_TYPE,
        ...getTransforms()
    });

    const upload = multer({
        storage: multerS3Config,
        limits: { fieldSize: 25 * 1024 * 1024 }
    });

    upload.array("images", config.get("maxImageCount"))(req, res, async(error) => {
        const paths = await req.files.map((file) => ({
            images: file.transforms[0].metadata.key
        }));
        await Post.create({
            title: req.body.title,
            userId: req.body.userId,
            Post_Images: paths,
        }, {
            include: [Post_Image]
        })
    });
    
})

基本上是声明multer-s3 适用于 AWS S3 的流媒体 multer 存储引擎。足以区分 multer 和 multer-s3。

该代码尚未经过测试,您可以解决方法并看看会发生什么!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nodejs、multer、aws S3 的相关文章

随机推荐

  • 如何融合CMMI和Scrum? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我在一家获得 CMMI 5 级认证的商店工作 该认证很重要 因为它使我们能够接触到某些客户和合同 我正在研究如何将 Scrum 与 CMMI 结合起来
  • Apple 推送通知和表情符号字符

    我最近发现这篇关于 APNS 和 Emoji 字符的非常有趣的文章 EASY APNS 只是为了好玩 http www easyapns com category just for fun 它包含一个包含所有支持的表情符号的列表 但是 我无
  • Kotlin - 了解 Getter 和 Setter

    Kotlin 自动生成它的 getter 和设置 但我从不引用它们 另外 在 Kotlin 中编写自定义 getter setter 的正确方法是什么 当我说myObj myVar 99我感到myVar是一个公共领域myObj我直接访问 这
  • Flutter,异步调用后渲染小部件

    我想渲染一个需要 HTTP 调用来收集一些数据的小部件 得到以下代码 简化 import package flutter material dart import dart async import dart convert void ma
  • 如何更新 C# Windows 控制台应用程序中的当前行?

    在 C 中构建 Windows 控制台应用程序时 是否可以写入控制台而无需扩展当前行或转到新行 例如 如果我想显示一个百分比来表示进程距离完成的程度 我只想更新与光标相同的行上的值 而不必将每个百分比放在新行上 这可以通过 标准 C 控制台
  • 如何访问 React Redux 中的存储状态?

    我只是在制作一个简单的应用程序来学习异步与 redux 我已经让一切正常工作 现在我只想在网页上显示实际状态 现在 我如何在渲染方法中实际访问商店的状态 这是我的代码 所有内容都在一页中 因为我刚刚学习 const initialState
  • 从 c++ 为 android (arm) 生成一个 python 库 - 也许用 swig?

    我想在我的项目中包含一个 C 库kivy https kivy org 蟒蛇应用程序 可以自动执行此操作swig https swig org Doc4 1 Python html and 迪斯图尔斯 https docs python o
  • SQL Server 输出子句

    我有点困惑为什么我似乎无法使用下面的语句获得插入行的 新身份 SCOPE IDENTITY 只是返回 null declare WorkRequestQueueID int declare LastException nvarchar MA
  • 图像的色调效果 - iOS

    我只是想知道 是否有可能为图像制作色调效果 但不使用OpenGl ES 最好使用CALayer 我花了一些时间寻找答案 但仍然一无所获 tnx 您是在谈论对图像进行着色吗 一种快速方法 尽管可能不是最好的方法 为此您需要一个自定义解决方案
  • 从 GSL 库中获取 C gsl_fit_linear() 函数中线性回归的 p 值

    我正在尝试用 C 语言重现 R 中的一些代码 因此我尝试使用以下函数来拟合线性回归gsl fit linear 功能 在 R 中 我将使用 lm 函数 它使用以下代码返回拟合的 p 值 lmAvgs lt lm c 1 23 11 432
  • 使所有新目录具有777权限

    我有一个脚本 运行时会在其中创建一个目录 home test 然后在其中写入一些文件 当我运行这个脚本时 它工作得很好 但是 当我从 perl 脚本调用它时 ret home testscript py 它没有权限 因此无法创建该文件夹 或
  • 有没有可用于将 32 位/64 位可执行文件打包在一起的工具? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我真的很喜欢 SysInternals 实用程序 例如 Process Explorer 处理 64 位兼容性的方式 看起来 32 位可执
  • 在 Unix 上连接文本文件中的多个字段

    我该怎么做 File1看起来像这样 foo 1 scaf 3 bar 2 scaf 3 3 File2看起来像这样 foo 1 scaf 4 5 foo 1 boo 2 3 bar 2 scaf 1 00 我想做的是找到同时出现的线条Fil
  • 用 NaN 对矩阵进行排序,提取索引向量并将 NaN 移到末尾

    mockup 3 5 nan 2 4 nan 10 nan 如何在忽略 NaN 的情况下按降序对这个向量进行排序 所得向量的长度必须与mockup 即我需要将所有 NaN 放在末尾 结果应该是这样的 mockupSorted 10 5 4
  • 远程编辑谷歌文档

    我正在尝试向我的网站添加一项功能 如下所示 单击按钮会将文本附加到 Google 文档 显然 我需要在驱动器中创建一个 Apps 脚本 问题是如何从我的网站触发 Apps 脚本 您可以假设我是驱动器 文档的所有者 因此有权以我喜欢的任何方式
  • 在 Swift 中将字符串转换为 CGFloat

    我是 Swift 新手 如何将字符串转换为 CGFloat I tried var fl CGFloat str as CGFloat var fl CGFloat CGFloat str var fl CGFloat CGFloat st
  • 弃用离线访问权限后在 Facebook 上注销/切换用户

    通过脸书弃用离线访问权限 https developers facebook com roadmap offline access removal 5 月 1 日起 Web 应用程序可以轻松延长 OAuth 访问令牌的持续时间 60 天 但
  • JavaScript 中的 setTimeout 是否接受真实(浮点)延迟时间_

    我只是在看JavaScript 计时事件 http www w3schools com js js timing asp 那里说 第二个参数表示从现在开始多少毫秒后您要执行第一个参数 现在 我知道在 JavaScript 中 浮点数和整数都
  • 如果左侧包含 null 并且右侧包含值,则在 sql 中向左移动单元格

    在 Sql 中 我得到如下格式的结果 我总共有 6 列 第一行第 6 列包含该值 第二行第 5 和第 6 列包含该值 但如果前一列不包含该值 我需要检查每个单元格 这意味着我需要在第一列中包含该值 实际结果 a b c d e f 1 1
  • Nodejs、multer、aws S3

    如何应用 uuid 和日期 以便存储在数据库中的文件名和存储在 S3 存储桶中的文件名相同 在当前的实现中 即使帖子是在几小时后发布的 uuid 和日期也始终相同 有人可以帮忙吗 真的很感激 const s3 new AWS S3 acce