Ruby on Rails:带有身份验证/授权/超时的图像下载

3
我对实现文件下载有一些疑问。我正在创建一个应用程序,其中使用attachment_fu和Amazon S3上传文件。到目前为止,在上传方面一切都运作得很好。现在是开始文件下载的时候了。这是我需要的:登录用户搜索和浏览图像,他们应该能够将文件添加到下载购物车中。最后,用户应该能够从S3下载这些文件,可能是作为压缩文件。是否有任何插件/宝石可以用于此?
1个回答

3
给客户一个包含所有文件的zip文件的缺点是需要先从S3上将所有文件拉回到您的服务器,然后再压缩。如果您想这么做,当作后台工作使用delayed_job或类似工具,而不要在浏览器请求中同步执行。使用Zlib::GzipWriter进行实际压缩,请参考http://ruby-doc.org/core/classes/Zlib/GzipWriter.html -- 它是Ruby的标准组成部分。然后可以通过以下方式之一:1.将zip文件作为附件发送给用户;2.向用户发送服务器上zip文件的链接;3.将zip文件上传到S3,然后发送指向S3 zip文件链接的电子邮件。请记得创建一个清除任务/工作以从系统中删除旧的zip文件...另外一种选择是不将文件压缩在一起,而是给用户一个或多个单独下载文件的链接。
S3使您能够创建一个指向S3文件的URL,该URL可以在一段时间内使用。(该文件在S3上是私有的,因此直接链接无法使用。)以下是使用attachment-fu和aws-s3 gem创建它的方法:
# I added this as a method to my model for the files stored in S3
def authenticated_s3_url
  # return a publicly usable url
  connect_to_aws # a local method which connects/re-connects to s3
  S3Object.url_for(full_filename, 
             bucket_name, 
            :expires_in => 60 * 60) # 1 hour
end

谢谢Larry K.我明白压缩文件不是一个好主意,最好的机制是提供直接链接到文件。但是,如果我这样做,用户将无法一次下载批量文件,除非我将压缩文件重新上传到S3。我对S3还不是很熟悉,所以我首先会尝试您建议的直接链接。我希望我需要的是“签名URL”,对吗? - randika
如果您将文件存储在无公共访问权限的S3上,则需要向用户提供已签名的URL才能使其下载文件。此外,如果您想这样做,压缩文件是一个不错的选择——特别是如果您的大多数客户将接收超过3个文件。少于3个文件,则解压zip归档的麻烦可能不值得。另外,在使用他人的Stack Overflow答案时,请记得给予信用。 - Larry K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接