使用flatter和node.js直接上传S3

使用flatter和node.js直接上传S3,node.js,amazon-s3,flutter,Node.js,Amazon S3,Flutter,我有一个node.js REST API,它可以保存用户的“帖子”,然后以JSON API格式检索数据,这很好,但我还需要在每个“帖子”中附加一些图像。我如何直接从我的flatter客户端上传到AWS S3,问题是我对如何处理这个问题有点困惑,因为我不想因为负载而通过我的服务器推送图像。我看到了一些关于如何上传图像的插件,但问题是我需要将图像链接保存在一个数组中,以便在用户打开它时加载图像,但是如果我首先需要上传图像并获取链接,我如何才能将链接保存到我的API中。谢谢 思想是,您的nodejs代

我有一个node.js REST API,它可以保存用户的“帖子”,然后以JSON API格式检索数据,这很好,但我还需要在每个“帖子”中附加一些图像。我如何直接从我的flatter客户端上传到AWS S3,问题是我对如何处理这个问题有点困惑,因为我不想因为负载而通过我的服务器推送图像。我看到了一些关于如何上传图像的插件,但问题是我需要将图像链接保存在一个数组中,以便在用户打开它时加载图像,但是如果我首先需要上传图像并获取链接,我如何才能将链接保存到我的API中。谢谢

思想是,您的nodejs代码必须为每个文件生成预签名的url,并将其作为json的一部分发送

预签名URL是从S3访问文件而不公开S3存储桶的最安全的方法

下面是一个获取URL的nodejs代码示例

const getPresignedUrl = async (fileName, fileType) => {

  const S3_BUCKET = 'my-s3-bucket'
  const s3 = new AWS.S3();  // Create a new instance of S3

  // Set up the payload of what we are sending to the S3 api
  const s3Params = {
    Bucket: S3_BUCKET,
    Key: fileName,
    Expires: 5000,
    //ContentType: fileType,
    // ACL: 'public-read',
    ContentType: 'application/octet-stream'
  };
  // Make a request to the S3 API to get a signed URL which we can use to upload our file

  try {
    const data = await s3.getSignedUrlPromise('getObject', s3Params);
    const returnData = {
      signedRequest: data,
      url: `https://${S3_BUCKET}.s3.amazonaws.com/${fileName}`
    };

    return returnData;

  } catch (err) {
    console.log('err: ', err);
  }
}
希望这有帮助