Как отправить динамически сгенерированный файл в приложении rails - PullRequest
6 голосов
/ 04 февраля 2010

Я пытаюсь обслуживать динамически генерируемые файлы в приложении 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 app и отправка его оттуда, но тогда файл будет сохранен там, чего я бы предпочел, чтобы не произошло.

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

Любые другие советы или мнения?

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

1 Ответ

19 голосов
/ 04 февраля 2010

Если это простая проблема, как вы ее описали, подойдет простое решение, подобное этому. Только не забудьте параметр :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

Edit:

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

  def download
    content = "chunky bacon\r\nis awesome"
    send_data content,  :filename => "bacon.txt" 
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...