这是我的第一个问题。
我让用户将自己的图片上传到数据库。 该图像存储为BLOB。
我能够成功地做到这一点。 我正在使用MySQL作为数据库。
我遇到问题的部分是在调用BLOB时将其显示为网站上的图像。
现在只显示二进制数据,显示许多奇怪的符号。我认为这是HTTP标题的问题。现在它在:
print "Content-Type: text/html"
我试过了:
print "Content-Type: image/jpeg"
我使用Python连接数据库并编写HTML。
编辑:代码:
def showFile():
# do SQL to retrieve blob where filename
conn, cursor = getConnectionAndCursor()
sql = """
select data
from upload
where id=1
"""
cursor.execute(sql)
data = cursor.fetchone()
blob = data[0]
print "<hr>"
print "This is what I'm trying"
print """<img src="data:image/jpeg;base64,%s/>""" % data
######################################################################
if __name__ == "__main__":
form = cgi.FieldStorage()
if "show_file" in form:
print "Content-Type: text/html"
print
printHeaders("Image upload example")
showFile()
printFooter()
答案 0 :(得分:6)
根据其编码方式,您也可以只为图像使用数据URI。如果它们被编码为base64 PNG,这样的东西可能会起作用。
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA..." />
正如@Alok所说,您可能需要先将其从二进制blob转换为base64,然后使用数据URI。
答案 1 :(得分:4)
图像以二进制格式存储在数据库中,因此一旦涉及使用解码功能的服务器将其恢复为图像
image.decode('base64')
这会将你的blob转换为图像
答案 2 :(得分:1)
好吧,您可以返回HTML响应,并使用现有答案的组合,或者您只需返回image/jpeg
响应,并将BLOB直接转储到stdout,具有类似的内容......
def showFile():
# do SQL to retrieve blob where filename
conn, cursor = getConnectionAndCursor()
sql = """
select data
from upload
where id=1
"""
cursor.execute(sql)
data = cursor.fetchone()
blob = data[0]
print blob
if __name__ == "__main__":
form = cgi.FieldStorage()
if "show_file" in form:
print "Content-Type: image/jpeg"
print
showFile()
......但这取决于你想要达到的目标。
答案 3 :(得分:1)
这取决于您需要完成的工作。
HTML页面上的单个图像。
1.1最佳方法是将其与Content-Type:image / jpeg(如果是jpeg)一起使用
import sys
def showFile(blob):
print "Content-Type: image/jpeg\r\n"
sys.stdout.flush()
print sys.stdout.buffer.write(image)
def getFile():
conn, cursor = getConnectionAndCursor()
sql =
"""
select data
from upload
where id=1
"""
cursor.execute(sql)
data = cursor.fetchone()
blob = data[0]
print blob
if __name__ == "__main__":
form = cgi.FieldStorage()
if "show_file" in form:
image = getFile()
showFile(image)
为什么是最好的方法?因为您可以使用触发此脚本的请求网址作为html文件中图片标签的来源
在一个html页面上有多个图像。
2.1在base64中转换blob
import base64
blob = base64.b64encode(blob).decode('utf-8')
# You need to decode it to get pure string and use it later in <img>
转换后可以放置它。
print(f"<img src="data:image/jpeg;base64,{blob}>")
注意:我在第二个示例中使用python3.8。我假设您正在使用cgi模块。