Как отправить динамически сгенерированный файл в приложении rails

Я пытаюсь обслуживать динамически сгенерированные файлы в приложении rails, поэтому, когда пользователь щелкает определенную ссылку, файл создается и отправляется клиенту с использованием send_data.

Файл не предназначен для повторного использования: это короткий текстовый файл, и восстановление должно быть очень недорогим, так как он не будет загружаться так часто; но если это необходимо или удобно, я могу сохранить его в базе данных, поэтому он генерируется только один раз.

Во-первых, я хотел бы сгенерировать файл в памяти и отправить его в контроллер. Я пытаюсь заархивировать что-то вроде этого:

def DownloadsController < ApplicationController
  def project_file
    project = Project.find(params[:id])
    send_data project.generate_really_simply_text_file_report
  end
end

Но я не знаю, как создать поток в памяти, поэтому в файловой системе не создается файл.

Другим вариантом было бы создание файла со случайным именем в каталоге tmp приложения rails и отправка его оттуда, но тогда файл будет храниться там, чего я бы предпочел не делать.

Редактировать: если я не ошибаюсь, send_file блокирует петицию до тех пор, пока файл не будет отправлен, так что это может сработать...

Есть еще советы или мнения?

заранее спасибо


person Ricardo Amores    schedule 04.02.2010    source источник


Ответы (1)


Если это простая проблема, как вы ее описываете, подойдет и такое простое решение. Только не забудьте параметр :filename, иначе файл будет называться «project_file».

  def project_file
    project = Project.find(params[:id])
    send_data project.generate_really_simply_text_file_report, :filename => "#{project.name}.txt"
  end

Изменить:

ваш project#generate_really_simply_text_file_report должен возвращать либо двоичные данные, либо путь к файлу, либо необработанную строку.

  def download
    content = "chunky bacon\r\nis awesome"
    send_data content,  :filename => "bacon.txt" 
  end
person Lucas    schedule 04.02.2010
comment
Моя проблема в том, что я не знаю, как генерировать двоичные данные для отправки в память. - person Ricardo Amores; 04.02.2010
comment
Спасибо! В итоге я использовал шаблон erb с методом render_to_string для генерации строковых данных. - person Ricardo Amores; 04.02.2010