2008-09-11 3 views
14

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

Соответствует ли RoR spport BLOB? Есть ли какие-либо ошибки, которые ползут, как только вы уже привязаны к Rails?

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

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

ответ

8

+1 для attachment_fu

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

(одна?) Сложная вещь, связанная с 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 обрабатывает все, что вызывает раздражение, о котором вы упоминаете, - о необходимости знать пути к файлам и все это дерьмо - ЗА ИСКЛЮЧЕНИЕМ одной маленькой проблемы при хранении в БД. Попробуйте; это стандарт для приложений rails. ЕСЛИ вы настаиваете на повторном создании колеса, исходный код для attachment_fu должен также документировать большую часть gotchas!

5

Вы можете использовать :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.

0

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

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

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

13

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

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

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

+0

Рельсы теперь имеют [send_data] (http://apidock.com/rails/ActionController/DataStreaming/send_data). – m33lky 2012-02-19 00:42:48

Смежные вопросы