使用用户信息从 React Native 上传 Amazon s3 存储桶中的项目



我正在使用带有AWS放大器的React Native在AWS S3上上传一张图像,用于移动应用程序开发。许多用户使用我的应用程序。

  1. 我希望每当任何用户通过移动应用程序上传S3上的图像时,我都希望获得用户的ID以及该图像。这样以后我就可以识别S3上的图像,即哪个图像属于哪个用户。我怎样才能做到这一点?

  2. 我使用AWS Auth Cognito进行用户注册/登录。我知道,每当用户(第一次(在AWS cognito中注册时,该用户都会在池中获得一个唯一的ID。每当用户上传图像时,我可以使用此用户ID与图像一起传递吗?

基本上,我想拥有某种形式的功能,这样我就可以追踪到在S3上上传图像的用户。这是因为在S3上传图像后,我稍后想处理此图像,并将结果发送回ONLY给图像的用户。

您可以在S3中以类似于下面的结构存储数据:

users/
123userId/
image1.jpeg
image2.jpeg
anotherUserId456/
image1.png
image2.png

然后,如果您需要来自给定用户的所有文件,您可以在S3 lambda-docs中使用ListObjects API这里是

// for lambda function
const AWS = require('aws-sdk');  
const s3 = new AWS.S3();
const objects = await s3.listObjectsV2({
Bucket: 'STRING_VALUE', /* required */
Delimiter: 'STRING_VALUE',
EncodingType: url,
ExpectedBucketOwner: 'STRING_VALUE',
Marker: 'STRING_VALUE',
MaxKeys: 'NUMBER_VALUE',
Prefix: 'STRING_VALUE',
RequestPayer: requester
}).promise()
objects.forEach(item => {
console.log(item
)});

或者,如果您使用S3 Lambda触发器,您可以从";键"/S3 lambda中接收到的事件中的filename(如果您使用了上面的结构(。

{
"key": "public/users/e1e0858f-2ea1-90f892b68e0c/item.jpg",
"size": 269582,
"eTag": "db8aafcca5786b62966073f59152de9d",
"sequencer": "006068DC0B344DA9E9"
}

另一种选择是写";userId";转换为将被上传到S3的文件的元数据。你可以通过";sub";属性,因此在S3 Lambda触发器函数中,您将从元数据中获取userId。

import Auth from "@aws-amplify/auth";
const user = await Auth.currentUserInfo();
const userId = user.attributes.sub;
return userId;

// use userId from Cognito and put in into custom metadata
import {Storage} from "aws-amplify";
const userId = "userIdHere"
const filename = "filename" // or use uuid()
const ref = `public/users/@{userId}/${filename}`
const response = await Storage.put(ref, blob, {
contentType: "image/jpeg",
metadata: {userId: userId},
});

AWS Amplify可以自动完成以上所有操作(创建文件夹结构等(,如果您不需要任何特殊的文件存储结构=此处的文档。您只需要使用";电平";所有物

Storage.configure({ level: 'private' });
await Storage.put(ref, blob, {
contentType: "image/jpeg",
metadata: {userId: userId},
});

//or set up level only for given action
const ref= "userCollection"
await Storage.put(ref, blob, {
contentType: "image/jpeg",
metadata: {userId: userId},
level: "private"
});

因此,例如,如果您使用级别";"私有";,文件";124.jpeg";将存储在S3中的
";private/us-east-1:6419087f-d13e-4581-b72e-7a7b32d7c7c1/userCollection/124.jpeg";

然而,正如你所看到的;美国东部-1:6419087f-d13e-4581-b72e-7a7b32d7c7c1";看起来与";sub";在Cognito中("sub"属性不包含区域(。

相关的讨论就在这里,也没有什么解决办法,但基本上你需要自己决定如何在项目中管理用户标识(如果你在任何地方都使用"sub"作为userId,或者你将使用另一个ID-我认为它被称为identityID,并将其视为userId(。

附言:如果你使用的是React Native,我想你会使用推送通知从后端发送更新-如果是这样的话,我也在做类似的事情("审核控制"(-所以我添加了另一个Lambda函数,Cognito的Post Confirmation Lambda,它在DynamoDB中创建ID为Cognitos的"的用户;sub";所有物然后用户可以从移动设备中保存推送通知所需的令牌,因此当AWS Rekognition完成对用户上传的图像的检测时,我查询DynamoDB并使用SNS将通知发送给最终用户。

最新更新