从 Amazon S3 获取文件到客户端 Web 应用程序 - 它应该通过 Web API 发生吗?
Getting a file from Amazon S3 to client web app - should it happen via the Web API?
我正在创建一个 ASP .Net Core 2.1 Web API。前端(写在 Angular 中)将使用此 API,它用于许多事情,其中之一是保存和检索文件(图片、PDF 和 Word 文档等)
我们将所有这些文件存储在 Amazon S3 上。我正在观看一个教程视频 (https://www.youtube.com/watch?v=eRUjPrMMhCc),其中显示了如何创建存储桶,以及如何从 ASP .Net Core 2.0 Web [=22= 上传和下载来自 Amazon S3 的文件],我认为这太棒了,因为它正是我所需要的。
但后来我意识到,虽然上传功能可能有用,但下载功能可能没有用。原因是,如果用户通过客户端 Web 应用程序请求一个文件(存储在 Amazon S3 上),并且此请求转到 API(这是我的初衷),那么 API 将必须首先从 S3 下载此文件(这可能需要几秒钟),然后将其发送到客户端(再过几秒钟)。所以文件被传输了两次,因此不必要地减慢了从 S3 到客户端获取文件的过程。
我的想法对吗?如果 Angular 客户端直接从 S3 检索文件而不是通过 API 检索文件会更好吗?在速度方面?
Amazon SDK
有一种方法可以处理您所有的情况,这里的原则是使用 SDK
从 Amazon S3
获得签名的 URL,然后将其传递给您的前端
import * as AWS from "aws-sdk/global";
AWS.config.update({
region: env.bucketRegion,
});
let clientParams:any = {
region: env.bucketRegion,
apiVersion: '2006-03-01',
params: {Bucket: env.rekognitionBucket}
};
if (environment.s3_endpoint) {
clientParams.endpoint = env.s3_endpoint;
}
let s3 = new S3(clientParams);
let url = s3.getSignedUrl('getObject', {
Bucket: env.rekognitionBucket,
Key: '1234.txt',
});
我正在创建一个 ASP .Net Core 2.1 Web API。前端(写在 Angular 中)将使用此 API,它用于许多事情,其中之一是保存和检索文件(图片、PDF 和 Word 文档等)
我们将所有这些文件存储在 Amazon S3 上。我正在观看一个教程视频 (https://www.youtube.com/watch?v=eRUjPrMMhCc),其中显示了如何创建存储桶,以及如何从 ASP .Net Core 2.0 Web [=22= 上传和下载来自 Amazon S3 的文件],我认为这太棒了,因为它正是我所需要的。
但后来我意识到,虽然上传功能可能有用,但下载功能可能没有用。原因是,如果用户通过客户端 Web 应用程序请求一个文件(存储在 Amazon S3 上),并且此请求转到 API(这是我的初衷),那么 API 将必须首先从 S3 下载此文件(这可能需要几秒钟),然后将其发送到客户端(再过几秒钟)。所以文件被传输了两次,因此不必要地减慢了从 S3 到客户端获取文件的过程。
我的想法对吗?如果 Angular 客户端直接从 S3 检索文件而不是通过 API 检索文件会更好吗?在速度方面?
Amazon SDK
有一种方法可以处理您所有的情况,这里的原则是使用 SDK
从 Amazon S3
获得签名的 URL,然后将其传递给您的前端
import * as AWS from "aws-sdk/global";
AWS.config.update({
region: env.bucketRegion,
});
let clientParams:any = {
region: env.bucketRegion,
apiVersion: '2006-03-01',
params: {Bucket: env.rekognitionBucket}
};
if (environment.s3_endpoint) {
clientParams.endpoint = env.s3_endpoint;
}
let s3 = new S3(clientParams);
let url = s3.getSignedUrl('getObject', {
Bucket: env.rekognitionBucket,
Key: '1234.txt',
});