簡體   English   中英

如何直接從Amazon s3存儲中提供非公共文件

[英]How to serve non public file directly from the Amazon s3 storage

我們需要在基於.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

預簽名的URL確實是您想要的。 由於您使用的是C#,因此以下是一些有用的代碼示例的鏈接:

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

無需通過網絡服務器將文件上傳到s3,它們可以直接發送。 下載時也是如此,直接從S3下載-不要先將它們復制到EC2,那樣會浪費帶寬和處理資源。

您可以使用Minio-dotnet客戶端庫開放源代碼並支持兼容的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工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM