2014-01-28 252 views
3

流文件,我有一個問題想流從Amazon S3的文件。基本上,我有存儲在amazom s3上的文件,因爲用戶需要進行身份驗證,所以無法直接訪問這些文件。我試圖找到一種方法來流式傳輸文件,而無需將每個文件從亞馬遜下載到我的服務器上,然後從我的服務器上下載到最終客戶端。我只是希望能夠直接流式傳輸文件,但似乎.NET中的大多數流讀取器類並不是這樣做的電纜。如果我錯了,請糾正我。從Amazon S3的

+0

你可能想澄清被存儲的文件是否需要在應用程序中的安全性的元素。據我所知,您可以在.net等創建使用Amazon S3的SDK公共(共享)的網址,如果你想生成這些並設置一個較大的到期時間,你可以轉發用戶到你生成鏈接:http:// docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURLDotNetSDK.html – JLo

回答

6

您無需將文件下載到您的服務器,通過打開流亞馬遜S3文件通過你的服務器以流從Amazon S3到客戶端的文件,然後從中讀取和客戶端流寫入(由緩衝區緩存) 。

示例代碼:

byte[] buffer = new byte[BUFFER_SIZE];     
GetObjectRequest getObjRequest = new GetObjectRequest().WithBucketName(Bucket_Name).WithKey(Object_Key); 

using (GetObjectResponse getObjRespone = amazonS3Client.GetObject(getObjRequest)) 
using (Stream amazonStream = getObjRespone.ResponseStream) 
{ 
    int bytesReaded = 0;   
    Response.AddHeader("Content-Length", getObjRespone.ContentLength.ToString()); 

    while ((bytesReaded = amazonStream.Read(buffer, 0, buffer.Length)) > 0 && Response.IsClientConnected) 
    { 
     Response.OutputStream.Write(buffer, 0, bytesReaded); 
     Response.OutputStream.Flush(); 
     buffer = new byte[BUFFER_SIZE]; 
    } 
} 
+0

哪些錯誤與'Stream.CopyTo'? – Gusdor

+0

只是如果你使用的.Net框架4.0或更高版本可以使用Stream.CopyTo,我使用它之前,我是有一個問題(文件損壞),但我不知道究竟是問題,但我認爲這是在流編碼。 –