首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用API网关S3将图像文件上传到NodeJS

使用API网关S3将图像文件上传到NodeJS
EN

Stack Overflow用户
提问于 2022-01-25 18:33:19
回答 2查看 1.7K关注 0票数 1

我正在尝试使用将一个图像文件上传到S3。因此,它是一个POST方法,在这个方法中,主体使用form-data获取图像文件。在TypeScript的帮助下,我用lambda-multipart-parser编写了lambda。它在本地工作得很好,但是当我在AWS中部署它时,文件大小发生了一些变化,看起来原始文件并没有真正正确地上传。

我的lambda代码是

代码语言:javascript
复制
import * as parser from 'lambda-multipart-parser'
import { s3Upload } from '../helper/common'

export const test = async (event) => {
  console.log('starting------')
  console.log('EVENT', event)
  const result = await parser.parse(event)
  console.log(result.files)
  const file = result.files[0]
  console.log('FILE', file)

  const s3Params = {
    Bucket: process.env.AWS_BUCKET,
    Key: `${Date.now().toString()}-${file.filename}`,
    Body: file.content,
    ContentType: 'image/png',
    ACL: 'public-read',
  }
  console.log('S3 PARAMS', s3Params)
  const s3Content = await s3Upload(s3Params)
  console.log('S3 CONTENT', s3Content)
}

我刚从helper打电话给helper

代码语言:javascript
复制
import { S3 } from 'aws-sdk'

export const s3Upload = async function (params) {
  let s3: S3
  if (process.env.IS_OFFLINE) {
    s3 = new S3({
      accessKeyId: process.env.AWS_ACCESS_KEY,
      secretAccessKey: process.env.AWS_SECRET_KEY,
    })
  }
  return new Promise((resolve) => {
    s3.upload(params, (err, data) => {
      if (err) {
        console.error(err)
        resolve(err)
      } else {
        resolve(data)
      }
    })
  })
}

这看起来像是节点包本身的问题,但我不确定!我能实现这个目标的其他工作方法是使用用类型记录编写的API网关将一个图像文件上传到S3?

EN

回答 2

Stack Overflow用户

发布于 2022-07-14 11:27:16

你能提供更多关于你的问题的信息吗?

我把你的代码用于本地测试。我发现您需要在if s3之后再次实例化is_offline。

代码语言:javascript
复制
import { S3 } from 'aws-sdk'

export const s3Upload = async function (params) {
  let s3: S3
  if (process.env.IS_OFFLINE) {
    s3 = new S3({
      accessKeyId: process.env.AWS_ACCESS_KEY,
      secretAccessKey: process.env.AWS_SECRET_KEY,
    })
  }

  // Here is the change

  s3 = new S3({
    region: 'us-east-1', // for example
  });
  return new Promise((resolve) => {
    s3.upload(params, (err, data) => {
      if (err) {
        console.error(err)
        resolve(err)
      } else {
        resolve(data)
      }
    })
  })
}

至少这对我有用。还在lambda内部,也用于本地的无服务器离线和API网关,所有这些都带有类型记录。

希望这能有所帮助!

致以问候!

票数 1
EN

Stack Overflow用户

发布于 2022-01-25 19:21:03

这可能是因为模块没有包含在lambda中,尝试执行npm init并将包安装在lambda或其他选项所在的文件夹中,更可取的做法是创建一个层并将包放在那里。

在这里,文档:https://docs.aws.amazon.com/cdk/api/v1/docs/aws-lambda-readme.html#layers

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70853893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档