Pregunta

Pronto comenzaré un proyecto que requiere soporte para archivos binarios de gran tamaño.Me gustaría usar Ruby on Rails para la aplicación web, pero me preocupa la compatibilidad con BLOB.En mi experiencia con otros lenguajes, marcos y bases de datos, los BLOB a menudo se pasan por alto y, por lo tanto, tienen una funcionalidad deficiente, difícil y/o con errores.

¿RoR admite BLOB adecuadamente?¿Hay algún problema que surja una vez que ya estás comprometido con Rails?

POR CIERTO:Quiero usar PostgreSQL y/o MySQL como base de datos backend.Obviamente, la compatibilidad con BLOB en la base de datos subyacente es importante.Por el momento, quiero evitar centrarme en las capacidades BLOB de la base de datos;Estoy más interesado en cómo reacciona Rails.Idealmente, Rails debería ocultarme los detalles de la base de datos, por lo que debería poder cambiar de una a otra.Si esto es no el caso (es decir:hay algún problema con el uso de Rails con una base de datos en particular), entonces menciónelo.

ACTUALIZAR:Además, aquí no me refiero sólo a ActiveRecord.Necesitaré manejar archivos binarios en el lado HTTP (carga de archivos de manera efectiva).Eso significa obtener acceso a los encabezados y transmisiones HTTP apropiados a través de Rails.Actualicé el título y la descripción de la pregunta para reflejar esto.

¿Fue útil?

Solución

+1 para adjunto_fu

Utilizo adjunto_fu en una de mis aplicaciones y DEBO almacenar archivos en la base de datos (por razones molestas que están fuera del alcance de esta conversación).

Lo (¿único?) complicado con los BLOB que he encontrado es que necesita una ruta de código separada para enviar los datos al usuario; no puede simplemente alinear una ruta en el sistema de archivos como lo haría si Era un expediente sencillo y corriente.

p.ej.Si estás almacenando información de avatar, no puedes simplemente hacer:

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

tienes que escribir alguna lógica contenedora y usar send_data, p.(a continuación se muestra SÓLO un ejemplo con adjunto_fu, en la práctica necesitarías SECAR esto)

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

Desafortunadamente, hasta donde yo sé, adjunto_fu (no tengo la última versión) no hace un envoltorio inteligente para usted; debe escribirlo usted mismo.

PDAl ver la edición de su pregunta, Attachment_fu maneja todas esas cosas molestas que menciona, sobre la necesidad de conocer las rutas de los archivos y toda esa basura, EXCEPTO el pequeño problema al almacenar en la base de datos.Darle una oportunidad;es el estándar para aplicaciones Rails.SI insistes en reinventar la rueda, ¡el código fuente de adjunto_fu también debería documentar la mayoría de los errores!

Otros consejos

En cuanto a la transmisión, puede hacerlo todo de una manera eficiente (al menos en cuanto a memoria).En el lado de carga, los parámetros de archivos en los formularios se abstraen como objetos IO que se pueden leer;en el lado de descarga, busque el formulario de render :text => eso requiere un argumento Proc:

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

Sin embargo, si tus cosas están en archivos en el disco, las soluciones antes mencionadas ciertamente funcionarán mejor.

Puedes usar el :binary escriba su migración de ActiveRecord y también limite el tamaño máximo:

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

ActiveRecord expone el contenido del BLOB (o CLOB) como una cadena Ruby.

Creo que tu mejor opción es el complemento adjunto_fu:http://github.com/technoweenie/attachment_fu/tree/master

ACTUALIZAR:Encontré más información aquí. http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/a81beffb93708bb3

Mire el complemento, x_enviar_archivo también.

"El complemento XSendFile proporciona una interfaz sencilla para enviar archivos a través del encabezado HTTP X-Sendfile.Esto permite que su servidor web proporcione el archivo directamente desde el disco, en lugar de transmitirlo a través de su proceso Rails.Esto es más rápido y ahorra mucha memoria si usas Mongrel.No todos los servidores web admiten este encabezado.YMMV."

No estoy seguro de si se puede utilizar con Blobs, puede que solo sea para archivos del sistema de archivos.Pero probablemente necesite algo que no bloquee el servidor web que transmite grandes cantidades de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top