ruby – 上传数据库中的图像
我希望将上传的图像保存在PostgreSQL数据库的bytea列中.我正在寻找有关如何将Rails中的图像保存到bytea列的建议,最好使用示例.
我使用Rails 3.1和“pg”驱动程序连接到PostgreSQL. 解决方法
将图像存储在自己的数据库中通常不是一个好主意
请参阅is it better to store images in a BLOB or just the URL?和Files – in the database or not?的讨论.请注意,这些问题及其答案与PostgreSQL无关. 这有一些PostgreSQL特有的皱纹. PostgreSQL没有任何增量转储功能*,因此如果您使用pg_dump备份,则必须为每个备份转储所有图像数据.存储空间和传输时间可能是一个问题,特别是因为您应该保留数周的备份,而不仅仅是一个最近的备份. 如果图像很大或很多,您可能需要考虑在文件系统中存储图像,除非您非常需要对它们进行事务性,符合ACID标准的访问.将文件名存储在数据库中,或者仅根据有用的密钥建立文件命名约定.这样,您就可以对映像目录进行简单的增量备份,并将其单独管理到数据库中. 如果将图像存储在FS中,则无法通过PostgreSQL数据库连接轻松访问它们. OTOH你可以直接从文件系统直接通过HTTP为他们提供服务,比你必须首先从数据库中查询它们时更加高效.特别是can use sendfile() from rails,如果您的图像在FS上,而不是在数据库中. 如果你真的必须将图像存储在数据库中 …然后它在概念上与在.NET中相同,但确切的细节取决于您使用的Pg驱动程序,您没有指定. 有两种方法可以做到: >按照你的要求存储和检索bytea;和 对于bytea正常的小图像: >将客户端的图像数据读入局部变量 对于更大的图像(超过几兆字节),请使用lo代替: 对于更大的图像,请不要使用bytea.它的理论最大值可能是2GB,但是in practice you need 3x the RAM (or more) as the image size would suggest因此你应该避免将bytea用于大图像或其他大型二进制数据. PostgreSQL有一个dedicated CREATE EXTENSION lo; CREATE TABLE some_images(id serial primary key,lo image_data not null); …然后使用 驱动程序ruby-pg为lo_create,lo_open等提供了wrapper calls,并为本地文件访问提供了lo_import.见this useful example. 请使用大对象而不是bytea. *通过流复制,PITR / WAL归档等可以实现增量备份,但是再次增加数据库大小会使WAL管理变得复杂.无论如何,除非你是专家(或“勇敢”),否则你应该采取pg_dump备份,而不是单独依靠复制和PITR.将图像放入数据库也会 – 通过增加数据库的大小 – 大大减慢pg_basebackup,这在故障转移方案中很重要. ?adminpack通过Pg连接为超级用户提供本地文件访问.但是,您的webapp用户永远不应拥有超级用户权限,甚至不应拥有与其一起使用的表的所有权.您的文件是否通过WebDAV等单独的安全通道进行读写. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |