3

S3 から画像を取得する必要があります。フォルダーを公開することも、署名付き URL を使用することもできないため、残っているのは GetObject(); だけです。ここで、取得する画像を Iframe のソースとして設定する必要があります。そのために、HttpWebHandler を使用しています。問題は、html ページを取得すると正常に動作することです。しかし、画像を取り戻そうとすると、ジャンク データしか得られません。これが私のコードです:

 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();
        }
}
4

1 に答える 1

3

ここにはいくつかの問題があります。

  1. Amazon から返される応答に Content-Type を設定していますが、アプリケーションからの応答には設定していません。
  2. 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();
于 2012-05-22T03:55:14.540 に答える