0

我有我想象的相当常见的设置。

我的 rails 3 应用程序托管在 Heroku 上,我使用 Paperclip 来管理视频和图像的文件上传,所有文件都保存在 Amazon S3 上。文件附加到的模型是条目,附件本身称为“媒体”。所以,我有这样的回形针设置:

class Entry < ActiveRecord::Base
  has_attached_file :media, {:storage=>:s3,
                             :bucket=>"mybucketname",
                             :s3_credentials=> <credentials hash>}

这一切都很好。但是,我现在想为文件添加下载链接,以便用户可以下载视频进行编辑。我这样做如下:

页面下载链接:

<p><%= link_to "Download", download_entry_path(entry) %></p>

这只是调用 EntriesController 中的下载操作,如下所示:

def download
  @entry = Entry.find(params[:id])
  if @entry.media.file?
    send_file @entry.media.to_file, :type => @entry.media_content_type, 
                                    :disposition => 'attachment', 
                                    :filename => @entry.media_file_name,
                                    :x_sendfile => true
  else
    flash[:notice] = "Sorry, there was a problem downloading this file"
    redirect_to report_path(@entry.report) and return      
  end  
end

由于某些下载会非常大,我想将下载集中到服务器以避免捆绑测功机。这就是我使用 x_sendfile 选项的原因。但是,我认为它设置不正确:在 heroku 日志中我可以看到:

2011-06-30T11:57:33+00:00 app[web.1]: X-Accel-Mapping header missing
2011-06-30T11:57:33+00:00 app[web.1]: 
2011-06-30T11:57:33+00:00 app[web.1]: Started GET "/entries/7/download" for 77.89.149.137 at 2011-06-30 04:57:33 -0700
2011-06-30T11:57:33+00:00 app[web.1]: ### params = {"action"=>"download", "controller"=>"entries", "id"=>"7"}
2011-06-30T11:57:33+00:00 heroku[router]: GET <my-app>/entries/7/download dyno=web.1 queue=0 wait=0ms service=438ms status=200 bytes=94741

“X-Accel-Mapping 标头丢失”消息表明有些事情不对,但我不知道是什么。基本上我不知道heroku的nginx服务器是否自动下载文件,如果没有,那么如何告诉它,我在heroku的文档中找不到任何关于它的东西(我可能正在寻找错误的东西)。

谁能让我直截了当?感谢任何建议 - 最大

4

1 回答 1

3

我不确定您为什么要通过服务器发送文件。如果它们存储在 S3 上,为什么不直接链接到它们呢?

<%= link_to "Download", entry.media.url %>

这样下载就完全绕过了你的 Heroku 服务器。

于 2011-06-30T12:17:22.830 回答