Django调用Oracle存储过程获取BLOB图片报错:'str' object has no attribute 'read'
错误原因分析
'str' object has no attribute 'read' 错误说明你在字符串对象上调用了read()方法,但字符串本身并没有这个方法——read()是类文件对象(比如Oracle数据库返回的BLOB流对象)才有的方法。
你的代码中fila[7]返回的是字符串类型,而非预期的BLOB流对象,所以调用.read()会触发这个错误。
解决方案
直接去掉.read()调用,根据fila[7]的实际类型处理:
情况1:fila[7]是二进制字节串(bytes)
这是BLOB字段的正常返回类型,直接传入base64.b64encode即可:
def listar_productos(): django_cursor = connection.cursor() cursor = django_cursor.connection.cursor() out_cur = django_cursor.connection.cursor() cursor.callproc('FASTFERIA.SP_LISTAR_PRODUCTOS', [out_cur]) lista = [] for fila in out_cur: data = { 'data': fila, # 去掉.read(),直接使用fila[7] 'imagen': str(base64.b64encode(fila[7]), 'utf-8') } lista.append(data) return lista
情况2:fila[7]是字符串类型(比如已被自动编码为base64)
如果数据库中存储的是已编码的字符串,直接使用该值即可:
'imagen': fila[7]
验证字段类型
不确定类型的话,可以先打印字段类型确认:
for fila in out_cur: print(type(fila[7])) # 查看输出是bytes还是str # 后续代码...
内容的提问来源于stack exchange,提问作者vicashi
相关产品推荐
相关产品推荐

