Rails:如何从控制器创建文件并将其保存在服务器中



由于一些奇怪的原因,我需要在服务器中保存一个文件(通常是直接下载的)。在我的情况下,我有一个用PDFKit创建的PDF文件,我需要保存。

# app/controllers/reports_controller.rb
def show
  @report = Report.find(params[:id])
  respond_to do |format|
    format.pdf { render :text => PDFKit.new(report_url(@report)).to_pdf }
  end
end

如果我进入reports/1.pdf,我得到了我期待的报告,但我想把它保存在服务器上。

是否有一个可靠的方法来保存一个文件在服务器从响应?

在我得到实际答案之前只是一个快速的注意:看起来你正在传递一个完全合格的URL (report_url(@report))到PDFKit.new,这是一种浪费——这意味着PDFKit必须向web服务器发出请求,而web服务器又需要通过Rails的路由器等来获取页面的内容。相反,您应该使用render_to_string在控制器中呈现页面,并将其传递给PDFKit.new,因为它将接受HTML字符串。记住这一点……

这在PDFKit的README的"用法"一节中有介绍。你可以这样做:

def show
  @report = Report.find(params[:id])
  kit       = PDFKit.new render_to_string(@report) # pass any options that the
  pdf_file  = kit.to_file '/some/file/path.pdf'    # renderer needs here (same
                                                   # options as `render`).
  # and if you still want to send it to the browser...
  respond_to do |format|
    format.pdf { render :file => pdf_file.path }
  end
end

最新更新