2012-05-22 77 views
1

我需要從S3中檢索圖像。我無法公開文件夾,也無法使用預先設置的URL,所以我只剩下GetObject();.現在我將找回的圖像必須設置爲Iframe的來源。爲此,我使用HttpWebHandler。問題是,如果我檢索一個HTML頁面,它工作正常。但是當我嘗試重新獲得圖像時,我得到的只是垃圾數據。這裏是我的代碼:從S3獲取圖像

public void ProcessRequest(HttpContext context) 
     { 

      NameValueCollection appConfig = ConfigurationManager.AppSettings; 
      _accessKeyId = appConfig["AWSAccessKey"]; 
      _secretAccessKeyId = appConfig["AWSSecretKey"]; 
      S3 = new AmazonS3Client(_accessKeyId, _secretAccessKeyId); 
      string responseBody = ""; 
      var request = new GetObjectRequest() 
      .WithBucketName(bucketName).WithKey("020/images/intro.jpg"); 
      var responseHeaders = new ResponseHeaderOverrides 
             { 
              ContentType = "image/jpeg" 
             }; 

      request.ResponseHeaderOverrides = responseHeaders; 
      using (var response = S3.GetObject(request)) 
      { 
       using (var responseStream = response.ResponseStream) 
       { 
        using (var reader = 
         new StreamReader(responseStream)) 
        { 
         responseBody = reader.ReadToEnd(); 
        } 
       } 

      } 
      context.Response.Write(responseBody); 
      context.Response.Flush(); 
      context.Response.End(); 
     } 
} 

回答

2

有幾個問題在這裏:

  1. 要設置在即將從亞馬遜迴響應的內容類型,而不是從你的應用程序
  2. 響應
  3. 您正在使用一個StreamReader讀取流作爲文本的內容,然後寫回文本

試試這個:

using (var response = S3.GetObject(request)) 
{ 
    using (var responseStream = response.ResponseStream) 
    { 
     context.Response.ContentType = "image/jpeg"; 

     var buffer = new byte[8000]; 
     int bytesRead = -1; 
     while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      context.Response.OutputStream.Write(buffer, 0, bytesRead); 
     } 
    } 
} 

context.Response.End(); 
+0

謝謝賈森,我還有一個相關的問題。您看到的上述代碼是我試圖從S3檢索HTML文件的程序的一部分。 HTML文件具有與之相關的對象(CSS,javascript,Images)。現在我有一個Web處理程序來獲取流並將其設置爲源。問題是我不知道傳入流的內容類型。你的代碼將工作得很好如果我只使用Images,但我也必須流式傳輸其他類型。有沒有辦法確定傳入流的內容類型?再次感謝您的幫助,非常感謝! –

+0

您有兩種選擇:您可以在S3中存儲內容時設置內容類型,並在返回時使用該內容類型值,或者可以根據文件的擴展名猜測類型。這裏有代碼(http://stackoverflow.com/questions/58510/using-net-how-can-you-find-the-mime-type-of-a-file-based-on-the-file-signature ),它有一些嗅探MIME類型的示例方法。使用文件擴展名可能足夠滿足您的需求,因此使用靜態字典或Windows註冊表可能是一個可接受的解決方案。 – Jason