暂时上传到S3,不用了就移除?

Temporarily upload on S3 and remove if it's not used?

我正在尝试使用 react-draft-wysiwyg 在 React 上实现所见即所得的文本编辑器。

为了使用文本编辑器上传图片,我正在尝试 post uploadCallback 函数上的文件到 S3 和 return url 将上传项目的 url 到编辑器。

但我不知道如何处理未使用的图像(提交前删除) 它只是在我的 S3 存储桶中闲逛。有什么好的方法可以防止这种情况发生吗?我只是想 post base64 格式的图像,但这似乎只是浪费内存的方式。

每个 Amazon S3 存储桶都可以配置为在设定的时间段后删除特定文件夹中的文件。我建议将所有临时图像推送到特定目录,然后将目录配置为在经过足够的时间让您的程序使用这些文件后自行清空。这样,您就不必主动监控任何东西 - S3 会自动为您清空直接基于文件的年龄。

有几种方法可以解决这个问题:

从 Lambda

获得预签名 URL

您可以在 API 网关后面编写一个 lambda 函数,您可以调用它来为您在 S3 上预先签署 URL 到 post。此 URL 将允许拥有此 URL 的任何人上传 一次 到 S3。当用户准备好提交文本编辑器时,您只需 post 使用预签名 URL 将附加文件发送到 S3。

C# Lambda 示例

IAmazonS3 client;
client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1);
// Generate a pre-signed URL.
GetPreSignedUrlRequest request = new GetPreSignedUrlRequest
   {
       BucketName = bucketName,
        Key        = objectKey,
        Verb       = HttpVerb.PUT,
        Expires    = DateTime.Now.AddMinutes(5)
    };
string url = null;
 url = s3Client.GetPreSignedURL(request);

// Upload a file using the pre-signed URL.
HttpWebRequest httpRequest = WebRequest.Create(url) as HttpWebRequest;
httpRequest.Method = "PUT";
using (Stream dataStream = httpRequest.GetRequestStream())
{
   // Upload object.
}

HttpWebResponse response = httpRequest.GetResponse() as HttpWebResponse;

您可以在 AWS S3s documentation 找到更多关于通过用 Java、C#、Ruby 等编写的 Lambda 获取预签名 URL 的示例。

要从您的 Reactjs 应用程序上传到预签名 URL,您可以在 this Whosebug post.

找到一些很棒的示例

S3 对象过期

您可以将所有挂起的图像移动到一个存储桶中,该存储桶的生命周期配置为 以在特定时间段内删除对象。然后,当提交 post 时,您可以将对象从临时存储桶移动到更永久的存储桶。有关 S3 object expiration can be found in their docs.

的更多信息