我正在尝试使用烧瓶模型存储图像。我不知道如何在postgres中存储图像,因此我将图像编码为base64
,并且我试图将结果文本存储在postgres中。它是有效的,但有任何建议的方法来使用烧瓶模型
class User_tbl(db.Model):
id = db.Column(db.Integer,primary_key=True)
mobile=db.Column(db.String(13),unique=True)
country=db.Column(db.String(30))
image=db.Column(db.String(256))
def __init__(self,mobile,country,image):
self.mobile=mobile
self.country=country
self.image = image
答案 0 :(得分:0)
我知道PostgreSQL中用于处理base64数据的编码和解码函数,请参阅:
https://www.postgresql.org/docs/current/static/functions-string.html
(编码/解码)
谢谢,
答案 1 :(得分:0)
避免所有这些编码和解码并简单地将其保存为二进制blob会容易得多。在这种情况下,请使用sqlalchemy.dialects.postgresql.BYTEA
列。
答案 2 :(得分:0)
在postgres中存储图像的recomended方法是将图像存储在静态文件夹(存储Javascript和CSS文件)中,并通过Web服务器即nginx提供。它可以比flask更高效地完成它。你应该只在postgres上存储你的图像的路径,然后将实际的图像存储在文件系统上。
答案 3 :(得分:0)
我知道回答这个问题可能为时已晚,但是在这些日子里我试图解决类似的问题,所提出的解决方案似乎都没有解决主要问题。 当然,任何最佳实践都取决于您的需求。但总的来说,你会发现在数据库中嵌入一个文件不是一个好习惯。这得看情况。 阅读" Storing Binary files in the Database"由postgresql wiki制作,我发现有一些谨慎,其中强烈推荐这种做法,例如当文件必须是ACID时。 在这些情况下,至少在Postgres中,bytea数据类型优先于文本或BLOB二进制文件,有时以服务器的某些更高内存要求为代价。
在这种情况下: 1)你不需要特殊的sqlalchemy方言。 LargeBinary数据类型就足够了,因为它将被翻译为目标平台的#34;大和/或不变的二进制类型"。 2)在这种特定情况下,你不需要PostgreSQL中的任何编码/解码功能。 3)正如我之前所说,将文件保存到文件系统并不总是一个好策略。在任何情况下都不要使用带有base64编码的文本数据类型。您的数据会或多或少地膨胀33%,从而导致巨大的存储影响,而bytea具有不同的缺点
因此,我建议对您的模型进行这些更改:
class User_tbl(db.Model):
id = db.Column(db.Integer,primary_key=True)
mobile=db.Column(db.String(13),unique=True)
country=db.Column(db.String(30))
image=db.Column(db.LargeBinary)
然后您只需将FileStorage参数作为二进制文件传递即可将文件保存到Postgres中:
image = request.files['fileimg'].read()