attachment_fu使用自定义域名的S3服务

Rails插件 attachment_fu 提供非常棒的文件上传管理功能。它支持文件系统、数据库及Amazon S3三种方式来存储上传的文件。

要使用 S3 这种存储方式,仅需在作为上传对象的Model类中(以Asset为例)调用带:storage => :s3选项的has_attachment方法。实际效果是,上传文件后,通过访问新创建的 Asset 对象的 public_filename 方法,便可获得形如 http://s3.amazonaws.com/mybucketname/assets/1/file.ext 这样的URL。

如果使用了S3的Virtual Hosting Name功能(通过CNAME设置),则上述URL并不是我们最终想要的形式。假设我的bucket名为assets.ashchan.com,DNS中使用CNAME指向了S3的服务器,那么我希望在通过attachment_fu上传的文件的Asset对象上,能拿到 http://assets.ashchan.com/asset/1/file.ext 这样的URL,而不是 http://s3.amazonaws.com/assets.ashchan.com/asset/1/file.ext。

好办,只要在Asset类中加上这个方法:

def public_url(thumbnail = nil)
  s3_protocol + self.bucket_name + "/" + self.full_filename(thumbnail)
end

调用时,参数与public_filename一致,而得到的是我们希望的自己域名的URL了。