如何直接从Amazon s3存储中提供非公共文件

时间:2016-02-25 08:05:05

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

我们需要使用基于.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上的Out文件不是Public,它们不是公共的,因此无法直接从客户端浏览器访问url,就像公共内容类型一样

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

您可以使用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

工作