2017-10-10 104 views
0

我面临一个独特的问题,我无法理解背后的原因。来自Amazon S3 Bucket的图像没有显示在第一个请求

我有Amazon S3帐户,并且我创建了存放我上传图片的存储桶。我正在使用以下代码来检索图像。我的问题是独一无二的,因为当我在第一个请求中检索图像时,它不会在网页上显示任何内容,但在随后的请求显示到网页后图像会被检索到。

我无法理解原因。

角JS代码

$scope.retrieveImage = function() 
{ 
    AWS.config.update({ 
     accessKeyId: "MY_ACCESS_KEY", 
     secretAccessKey: "MY_SECRET_KEY" 
    }); 

    AWS.config.region = "BUCKET_REGION"; 

    var bucketInstance = new AWS.S3(); 
    var params = { 
     Bucket: "BUCKET_NAME", 
     Key: "FILE_NAME" 
    } 
    bucketInstance.getObject(params, function (err, file) { 
     if (file) { 
      $scope.imgSrc = "data:" + file.ContentType + ";base64," + encode(file.Body);   
     } else { 
      console.log('error::', err); 
     } 
    }); 
} 

function encode(data) { 
    var str = data.reduce(function (a, b) { return a + String.fromCharCode(b) }, ''); 
    return btoa(str).replace(/.{76}(?=.)/g, '$&\n'); 
} 
+1

这个问题可能与AngularJs有关,您测试的图像是在AngularJs之外检索的,或者您可以使用Chrome Developer工具监视网络流量,您很可能会发现图像是从Amazon S3返回的每个请求和你的AngularJs视图只是不正确刷新 –

+0

你是对的。问题在于Angular JS。应用$ scope。$ apply()后,它会在第一次加载时开始显示图像。 – user1843970

+0

很高兴你想通了,我添加了我的评论作为答案,因为它是答案:) –

回答

2

这个问题可能与AngularJs有关,确认图像是在AngularJs之外检索的,或者您可以使用Chrome Developer工具监控网络流量,您可能会发现图像是从每个请求的Amazon S3返回的,并且您的AngularJs视图只是不能正确刷新

1

你应该阅读更多关于S3 Data Consystency Model

亚马逊S3提供读后写在所有区域中的S3存储桶的新 对象PUTS一致性有一个警告。 需要注意的是,如果您在创建对象之前对密钥名称(如果存在对象存在 )进行HEAD或GET请求,则Amazon S3提供了 最终一致性,用于写后读写。

Amazon S3在覆盖所有地区的PUTS和DELETES 方面提供最终一致性。

这意味着有一些延迟/延迟后,你把成功的代码。