Поддержка Rails Binary Stream - PullRequest
       14

Поддержка Rails Binary Stream

15 голосов
/ 11 сентября 2008

Я скоро начну проект, который требует поддержки бинарных файлов большого размера. Я бы хотел использовать Ruby on Rails для веб-приложения, но меня беспокоит поддержка BLOB. По моему опыту работы с другими языками, платформами и базами данных, BLOB-объекты часто игнорируются и поэтому имеют плохую, сложную и / или ошибочную функциональность.

Соответствует ли RoR BLOB? Есть ли какие-нибудь ошибки, которые всплывают, когда вы уже участвуете в Rails?

Кстати: я хочу использовать PostgreSQL и / или MySQL в качестве базы данных. Очевидно, что поддержка BLOB в базовой базе данных важна. На данный момент я хочу не фокусироваться на возможностях BLOB БД; Меня больше интересует, как реагирует сам Rails. В идеале Rails должен скрывать детали базы данных от меня, и поэтому я должен иметь возможность переключаться с одной на другую. Если это не случай (то есть: есть некоторая проблема с использованием Rails с определенной БД), пожалуйста, укажите это.

ОБНОВЛЕНИЕ: Кроме того, я не просто говорю об ActiveRecord здесь. Мне нужно обрабатывать двоичные файлы на стороне HTTP (загрузка файлов эффективно). Это означает получение доступа к соответствующим HTTP-заголовкам и потокам через Rails. Я обновил название вопроса и описание, чтобы отразить это.

Ответы [ 5 ]

13 голосов
/ 12 сентября 2008

Что касается потоковой передачи, вы можете сделать все это (по крайней мере, в памяти) эффективным способом. На стороне загрузки параметры файла в формах абстрагируются как объекты ввода-вывода, из которых вы можете читать; на стороне загрузки посмотрите на форму render :text =>, которая принимает аргумент Proc:

render :content_type => 'application/octet-stream', :text => Proc.new {
    |response, output|
    # do something that reads data and writes it to output
}

Однако, если ваши файлы находятся в файлах на диске, вышеупомянутые решения, безусловно, будут работать лучше.

8 голосов
/ 12 сентября 2008

+ 1 для attachment_fu

Я использую attachment_fu в одном из моих приложений и ДОЛЖЕН хранить файлы в БД (по назойливым причинам, которые выходят за рамки этого условия).

(Одна?) Хитрая вещь, связанная с BLOB, я обнаружил, что вам нужен отдельный путь к коду для отправки данных пользователю - вы не можете просто встроить путь в файловую систему, как вы был бы, если бы это был файл простого Джейн.

например. если вы храните информацию об аватаре, вы не можете просто сделать:

<%= image_tag @youruser.avatar.path %>

Вы должны написать некоторую логику оболочки и использовать send_data, например (ниже приведен просто пример с attachment_fu, на практике вам нужно его высушить)

send_data(@youruser.avatar.current_data, :type => @youruser.avatar.content_type, :filename => @youruser.avatar.filename, :disposition => 'inline' )

К сожалению, насколько я знаю, attachment_fu (у меня нет последней версии) не делает для вас хитрой упаковки - вы должны написать это сами.

P.S. Видя, что ваш вопрос отредактирован - Attachment_fu обрабатывает все эти раздражающие вещи, о которых вы упомянули - о необходимости знать пути к файлам и всякую ерунду - за исключением одной маленькой проблемы при хранении в БД. Дайте ему попытку; это стандарт для рельсовых приложений. Если вы настаиваете на повторном изобретении колеса, исходный код attachment_fu также должен документировать большинство ошибок!

5 голосов
/ 11 сентября 2008

Вы можете использовать тип :binary в миграции ActiveRecord, а также ограничить максимальный размер:

class BlobTest < ActiveRecord::Migration
  def self.up
    create_table :files do |t|
      t.column :file_data, :binary, :limit => 1.megabyte
    end
  end
end

ActiveRecord представляет содержимое BLOB (или CLOB) в виде строки Ruby.

3 голосов
/ 11 сентября 2008

Я думаю, что ваша лучшая ставка - это плагин attachment_fu: http://github.com/technoweenie/attachment_fu/tree/master

ОБНОВЛЕНИЕ: Более подробную информацию вы найдете здесь http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/a81beffb93708bb3

0 голосов
/ 12 сентября 2008

Посмотрите на плагин, x_send_file тоже.

"Плагин XSendFile предоставляет простой интерфейс для отправки файлов через HTTP-заголовок X-Sendfile. Это позволяет веб-серверу обслуживать файл непосредственно с диска, а не передавать его через процесс Rails. много памяти, если вы используете Mongrel. Не каждый веб-сервер поддерживает этот заголовок. YMMV. "

Я не уверен, что это можно использовать с BLOB-объектами, это может быть только для файлов в файловой системе. Но вам, вероятно, нужно что-то, что не связывает веб-сервер, передающий большие куски данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...