Вопрос

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

Поддерживает ли RoR BLOB-объекты адекватно?Есть ли какие-нибудь ошибки, которые возникают, когда вы уже знакомы с Rails?

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

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

Это было полезно?

Решение

+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 также должен документировать большинство ошибок!

Другие советы

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

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

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

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

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

ОБНОВЛЯТЬ:Здесь нашел дополнительную информацию http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/a81beffb93708bb3

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top