我有一个在Heroku上托管的Rails应用程序.该应用程序在Amazon S3上生成并存储PDF文件.用户可以下载这些文件以便在浏览器中查看或保存在他们的计算机上.
我遇到的问题是虽然可以通过S3 URL下载这些文件(如"https://s3.amazonaws.com/my-bucket/F4D8CESSDF.pdf"),但这显然不是一个好方法.它.不希望向用户公开关于后端的大量信息,更不用说上升的安全问题了.
是否有可能让我的应用以某种方式从控制器中的S3检索文件数据,然后为用户创建下载流,以便不暴露亚马逊URL?
我一直在使用paperclip和aws-s3:
def authenticated_url(style = nil, expires_in = 90.minutes)
AWS::S3::S3Object.url_for(attachment.path(style || attachment.default_style), attachment.bucket_name, :expires_in => expires_in, :use_ssl => true)
end
Run Code Online (Sandbox Code Playgroud)
新的回形针使用AWS-SDK gem,它会打破这个错误:
undefined method `url_for' for AWS::S3:Class
Run Code Online (Sandbox Code Playgroud)
任何人都知道如何使用此方法来使用新的AWS-SDK gem?
现在我正在使用Amazon S3和Paperclip,它允许我的用户上传与他们正在创建的事件相关联的图像.我的最终目标是,因为其他人可以查看此事件,以便能够点击图像并让它提示保存到他们的计算机.截至目前,单击该链接将在浏览器窗口中打开图像.我宁愿让它要求他们下载.所有图像仅保存在S3上,而不是本地.如果可能,也需要隐藏暴露的s3网址或伪装它
这是我目前的设置
的index.html
<%= link_to 'Download Creative', event.creative.url, class: "btn btn-info" %>
Run Code Online (Sandbox Code Playgroud)
Event.rb
has_attached_file :creative,
:styles => { :thumb => "150x150", :custcreative => "250x75" },
:path => ":attachment/:id/:style.:extension",
:s3_domain_url => "******.s3.amazonaws.com",
:storage => :s3,
:s3_credentials => Rails.root.join("config/s3.yml"),
:bucket => '*****',
:s3_permissions => :public_read,
:s3_protocol => "http",
:convert_options => { :all => "-auto-orient" },
:encode => 'utf8'
Run Code Online (Sandbox Code Playgroud)
希望有人可以帮助我.
我正在尝试使用paperclip 4.1.1将CSV文件附加到Rails3模型,但是我无法获得S3报告的内容类型text/csv(相反,我得到text/plain).当我随后从S3下载文件时,扩展名将更改为与内容类型匹配,而不是保留原始扩展名(因此test.csv将作为test.txt下载).
从我所看到的,当您上传文件时,FileAdapter将使用ContentTypeDetector(调用file -b --mime filename)确定的任何值来缓存创建时的内容类型.不幸的是,CSV文件返回text/plain有意义,你怎么能真正区分它?尝试attachment.instance_write(:content_type, 'text/csv')仅使用模型中的值设置内容类型,并且不会影响写入S3的内容.
FileAdapter的content_type在此处初始化:https://github.com/thoughtbot/paperclip/blob/v4.0/lib/paperclip/io_adapters/file_adapter.rb#L14
创建io_adapter的调用:https: //github.com/thoughtbot/paperclip/blob/v4.0/lib/paperclip/attachment.rb#L98
我真的有一个通用上传(所以我不能硬编码S3标头定义中的内容类型has_attached_file),我真的不想要内容类型的欺骗保护.有什么想法/建议吗?我宁愿不降级到3.5,因为这意味着只是拖延痛苦,但如果这是唯一的方法,我会接受它......
如何为用户形成 url 链接,以便当用户单击该链接时,它会强制他们下载 AWS S3 对象?
我见过这两种解决方案:使用 send_file 从 Amazon S3 下载文件?和使用 send_file 从 Amazon S3 下载文件?但是,它们似乎引用了旧的 AWS S3 v1 SDK,并且 v2 AWS S3 SDK 中似乎没有 url_for。
谢谢。