【问题标题】:How to serve non public file directly from the Amazon s3 storage如何直接从 Amazon s3 存储提供非公共文件
【发布时间】:2016-06-07 21:19:39
【问题描述】:

我们需要开发基于 .net 的 Web 应用程序,该应用程序将使用应用程序的管理面板将文件上传到 Amazon S3 存储桶,并且客户端将获得带有 client.aspx 文件的可下载文件。

我们看了几个例子,对一些从 S3 存储下载非公共文件的示例代码感到困惑。下面是一个这样的例子

AmazonS3Config config = new AmazonS3Config()
{
RegionEndpoint = RegionEndpoint.USEast1
};
IAmazonS3 client = new AmazonS3Client(accessKey, secretKey, config);
string dest = System.IO.Path.GetTempPath() + "event.mp4";
using (client)
{
GetObjectRequest request = new GetObjectRequest() { BucketName = "bucketname" + @"/" + "videos2015", Key = "event.mp4" };
using (GetObjectResponse response = client.GetObject(request))
{
response.WriteResponseStreamToFile(dest);
}
}
Response.Clear();
Response.AppendHeader("content-disposition", "attachment; filename=" + "dynamic_filename.png");
Response.ContentType = "application/octet-stream";
Response.TransmitFile(dest);
Response.Flush();
Response.End();

当用户单击链接时,以下代码将在 Web 服务器上执行,代码在 Web 服务器上下载文件,然后将相同的文件提供给客户端......如果我没记错的话。有没有一种方法可以让我们直接从 AWS S3 存储中下载文件。

在上述情况下,既浪费服务器资源,也增加了下载时间。

AWS 上的输出文件不是公开的,它们是非公开的,因此无法从客户端浏览器直接访问 URL,就像在公共内容类型的情况下一样

【问题讨论】:

  • 我认为我的问题的解决方案是 Amazon S3 预签名 URL
  • 但是您可以只授予您存储桶的公开下载权限吗?
  • 我无法公开文件...

标签: c# asp.net amazon-web-services amazon-s3 aws-sdk


【解决方案1】:

预签名的网址确实是您正在寻找的。由于您使用的是 C#,因此这里是一些有用的代码示例的链接:

http://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURLDotNetSDK.html

无需通过您的网络服务器将文件上传到 s3,它们可以直接发送。下载也是一样,直接从 S3 下载 - 不要先将它们复制到 EC2,否则会浪费带宽和处理资源。

【讨论】:

    【解决方案2】:

    您可以使用Minio-dotnet client library 它的开源并支持兼容的 S3 API。

    这是PresignedPostPolicy 的示例

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    using Minio;
    
    namespace Minio.Examples
    {
        class PresignedPostPolicy
        {
            static int Main()
            {
              /// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and
              /// my-objectname are dummy values, please replace them with original values.
                var client = new MinioClient("s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY");
                PostPolicy form = new PostPolicy();
                DateTime expiration = DateTime.UtcNow;
                form.SetExpires(expiration.AddDays(10));
                form.SetKey("my-objectname");
                form.SetBucket("my-bucketname");
    
                Dictionary <string, string> formData = client.PresignedPostPolicy(form);
                string curlCommand = "curl ";
                foreach (KeyValuePair<string, string> pair in formData)
                {
                        curlCommand = curlCommand + " -F " + pair.Key + "=" + pair.Value;
                }
                curlCommand = curlCommand + " -F file=@/etc/bashrc https://s3.amazonaws.com/my-bucketname";
                Console.Out.WriteLine(curlCommand);
                return 0;
            }
        }
    }
    

    以下是PresignedPutObject

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    using Minio;
    
    namespace Minio.Examples
    {
        class PresignedPutObject
        {
            static int Main()
            {
              /// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and
              /// my-objectname are dummy values, please replace them with original values.
                var client = new MinioClient("s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY");
                Console.Out.WriteLine(client.PresignedPutObject("my-bucketname", "my-objectname", 1000));
                return 0;
            }
        }
    }
    

    希望对你有帮助。

    PS:我为Minio工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 2019-01-29
      • 1970-01-01
      相关资源
      最近更新 更多