1

所以这是我的代码。看起来像典型的雾代码。

prefix = 'data:image/png;base64,'
png = Base64.decode64(data[prefix.length, data.length-1])

aws_settings = YAML.load_file(RAILS_ROOT + "/config/amazon_s3.yml")[RAILS_ENV] rescue nil
if aws_settings
  connection = Fog::Storage.new(
    :provider => 'AWS',
    :aws_access_key_id => aws_settings['access_key_id'],
    :aws_secret_access_key => aws_settings['secret_access_key']
  )

  directory = connection.directories.get(aws_settings['bucket_name'])

  filename = "#{quiz_id}/#{user_id}_#{question_id}.png"
  file = directory.files.create(
    :key => filename,
    :body => png,
    :public => true
  )
end

问题是当我调用 file.public_url 时,我会随机获得两个不同的 url 之一。要么我会得到:

https://bucket_name.s3.amazonaws.com/19/235_146.png

或者

http://s3.amazonaws.com/bucket_name/19/235_150.png

虽然我不在乎一种或另一种方式,但我希望网址保持一致。

有谁知道如何解决这个问题?我在我的代码中做错了吗?

我还应该提到,我是在 Delayed::Job 中执行此操作的。当我作为普通方法调用执行此操作时,它似乎总是给我 https 版本。但是当我把它坚持到延迟工作中时,我就会得到随机性。很奇怪。

4

1 回答 1

1

哇,这有点尴尬。这已经变成了关于延迟工作的教训。显然它已经缓存了我的旧代码,我在其中硬编码 url 字符串以将其存储起来。像这样: url = "http://s3.amazonaws.com/bucket_name/{quiz_id}/{user_id}_{question_id}.png"

我后来改成这样:url = file.public_url

如果您的存储桶名称不符合 dns 标准,Fog 会默认使用该字符串。这就是为什么我很困惑为什么会发生这种情况。所以,是的,只是被使用的旧缓存代码。我关闭了延迟的工作并重新启动它,问题就消失了。

我能够弄清楚的方法是我查看了延迟的作业日志,并注意到它仍然有一些旧的 puts 语句打印在那里。那是它点击的时候。:]

于 2012-12-22T14:11:51.270 回答