显示来自 AWS 的用户资料图片

Posted

技术标签:

【中文标题】显示来自 AWS 的用户资料图片【英文标题】:Showing Users' Profile Pictures from AWS 【发布时间】:2016-03-30 10:48:27 【问题描述】:

我是 AWS 的新手,我想在开始构建之前了解一些关键概念的工作原理。我找到了本教程,用于在节点 JS 中将图像直接上传到 AWS:

https://devcenter.heroku.com/articles/s3-upload-node#uploading-directly-to-s3

在我的 web 应用程序中,我使用的是 MongoDB,每个用户(用户架构)都可以更改他们的个人资料图片。在高层次上,我在想一旦用户选择了一张新图片并点击保存,我会按照上述步骤将新图片直接上传到 AWS 'bucket'。

然后我将如何将它呈现在用户的个人资料页面上?我是否需要在 AWS 端使用数据库(并跳过我为我的应用程序使用的 mongodb 部分)将每个用户与个人资料图片相关联?我了解“保存到 AWS”部分,但不清楚的是如何以与用户关联的方式检索/渲染图像(在保存到 AWS 之后)。这是我的猫鼬用户架构:

'use strict';

var crypto = require('crypto');
var bcrypt = require('bcryptjs');
var mongoose = require('mongoose');
var recipeSchema = require('./recipe.js').schema;
//need the objectID, see: https://gist.github.com/fwielstra/1025038
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;

var userSchema = new Schema(
  email: 
    type: String
  ,
  password: String,
  resetPasswordToken: String,
  resetPasswordExpires: Date,
  //image: String ---> replacing this url with AWS
  picture: ObjectId,
  name: String,
  facebook: 
    id: String,
    token: String,
    pictures: String
  ,

  emailSubscription: Boolean,


   recipeBox: [
    id: ObjectId,
    done: Boolean
  ]
);


var User = module.exports = mongoose.model('User', userSchema);

【问题讨论】:

【参考方案1】:

您可以将记录保存在将图像与用户相关联的数据库中。您可以为此使用任何数据库,MongoDB 或 DynamoDB 或 mysql 或您想使用的任何其他数据库。这里没有什么特别的事情需要您在 AWS 上使用一些特殊的数据库类型来将图像位置存储在 S3 上。

然后您可以将 S3 配置为将存储桶作为静态网站提供服务。当您想要显示图像时,您只需使用图像的 S3 URL。

编辑以回答 cmets 中的问题:

您应该阅读您链接的 Heroku 教程。请参阅此部分:

您可能希望为对象指定另一个自定义名称 使用文件已经命名的那个,这很有用 用于防止 S3 存储桶中的意外覆盖。这个名字可以 例如,与用户帐户的 ID 相关。

您可以在此处控制存储在 S3 上的文件的名称,可能使用用户 ID 作为名称。在同一代码块中,您可以使用用户个人资料图像的位置更新数据库。

【讨论】:

我明白了。并且该 URL 中会包含用户 ID(或用户的其他标识符)? 如果您将用户 ID 放在文件名中,则 URL 中只会包含用户 ID。 S3 对您应用的用户一无所知,因此它不会自动为您执行此操作。 @Mark B 上传图片后,我将图片的 aws 链接存储在我的数据库中,但我的链接已过期(即使在上传时删除了 expires 参数)。 @sacDahal 请不要将全新的问题作为 cmets 发布在其他问题上。

以上是关于显示来自 AWS 的用户资料图片的主要内容,如果未能解决你的问题,请参考以下文章

如何仅显示来自 aws s3 ls 命令的文件?

aws(亚马逊WEB服务)详细资料大全

有没有办法用来自特定用户的推文触发 AWS lambda 函数

如何获得有关 aws 转码器作业状态的通知

如何将驻留在账户 A 中的 s3 存储桶的访问权限授予来自多个 aws 账户的不同 iam 用户?

AWS S3仅允许来自存储桶的映像显示在特定IP地址上