ruby-on-rails - overview - attach active storage
Soporte de Rails Binary Stream (5)
+1 para attachment_fu
Utilizo attachment_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 convocatoria).
El (¿uno?) Asunto complicado con BLOB que he encontrado es que necesitas una ruta de código separada para enviar los datos al usuario; no puedes simplemente alinear una ruta en el sistema de archivos como lo harías si era un archivo simple de Jane.
por ejemplo, si está almacenando información de avatar, simplemente no puede:
<%= image_tag @youruser.avatar.path %>
tienes que escribir un poco de lógica de envoltura y usar send_data, por ejemplo (a continuación, SOLO es un ejemplo w / attachment_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, por lo que sé, attachment_fu (no tengo la versión más reciente) no es muy útil para ti, tienes que escribirlo tú mismo.
PD: ver tu edición de pregunta: Attachment_fu maneja todas las cosas molestas que mencionas, sobre la necesidad de conocer las rutas de archivos y toda esa porquería, EXCEPTO el pequeño problema cuando se almacena en el DB. Darle una oportunidad; es el estándar para aplicaciones de rieles. ¡Si insiste en reinventar la rueda, el código fuente de attachment_fu debería documentar la mayoría de los errores también!
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 el soporte 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 defectuosa.
¿RoR spport BLOBs adecuadamente? ¿Hay problemas que se arrastran una vez que ya estás comprometido con Rails?
Por cierto: quiero usar PostgreSQL y / o MySQL como la base de datos back-end. Obviamente, el soporte de BLOB en la base de datos subyacente es importante. Por el momento, quiero evitar enfocarme en las capacidades BLOB de DB; Estoy más interesado en cómo Rails reacciona. Idealmente, Rails debería ocultarme los datos de la base de datos, así que debería poder cambiar de uno a otro. Si este no es el caso (es decir, hay algún problema con el uso de Rails con un DB en particular), por favor hágalo.
ACTUALIZACIÓN: Además, no estoy hablando de ActiveRecord aquí. Tendré que manejar archivos binarios en el lado HTTP (carga de archivos de manera efectiva). Eso significa obtener acceso a los encabezados y flujos HTTP adecuados a través de Rails. He actualizado el título y la descripción de la pregunta para reflejar esto.
Creo que tu mejor opción es el complemento attachment_fu: http://github.com/technoweenie/attachment_fu/tree/master
ACTUALIZACIÓN: se encontró más información aquí http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/a81beffb93708bb3
Puede usar el tipo :binary
en su migración de ActiveRecord y también restringir 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 BLOB (o CLOB) como una Cadena de Ruby.
En cuanto a la transmisión, puede hacerlo todo de una manera (al menos con memoria) eficiente. En el lado de la carga, los parámetros del archivo en formularios se abstraen como objetos IO de los que se puede leer; en el lado de la descarga, busque la forma de render :text =>
que toma un argumento de 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 mencionadas funcionarán mejor.
Mire en el plugin, x_send_file también.
"El complemento XSendFile proporciona una interfaz simple para enviar archivos a través del encabezado HTTP X-Sendfile. Esto permite que su servidor web sirva 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 está utilizando Mongrel. No todos los servidores web admiten este encabezado. YMMV. "
No estoy seguro si se puede usar con Blobs, puede ser solo para archivos en el sistema de archivos. Pero probablemente necesite algo que no ate el servidor web que transmite grandes cantidades de datos.