本篇内容来自https://blog.csdn.net/u011418173/article/details/79641348
起因
之前项目是用数据库的image格式保存图片,但是考虑到图片一旦很大的时候,客户端加载图片的速度就会变得非常慢,导致登录时间很长。因此必须改为用url的方式,将图片的url记录在数据库中,指向一个图片的虚拟存储位置。
下图显示的就是某个用户的头像,以二进制的形式保存在字段photo中,这里用可视化的方式显示给大家。
解决方法
既然不想在数据库保存图片,但是现有的图片都保存在数据库,所以理所当然应该将图片数据(sqlserver是用image二进制的格式保存的)导出并重新保存到png等格式的文件中。这一步当然不能一个个手动的处理,不然效率太慢了。
解决的方法挺多的,曾考虑过使用c++或是java的方式实现,但思前想后,还是决定用python,因为语法真的超简洁有木有,等下看代码就知道啦~
首先要做一些准备工作:
-
安装python2.7.14
其实只要是2.7系列,应该都是可以的 -
使用pip安装pyodbc
pip的使用很简单,拿win10举例,在python的安装路径下,进入Scripts文件夹,按住shift在空白处单击右键,如图所示:
点击“在此处打开Powershell窗口”按钮,可以在这个目录下开启控制台,而不用在cmd中慢慢敲路径(小技巧)
然后在控制台输入“pip install pyodbc”,就可以自动安装pyodbc模块了 -
使用pip安装Pillow
方法同pyodbc的安装,作用是为了使用PIL的Image模块
接下来编写代码就可以了:
import pyodbc import io from PIL import Image #保密起见,这里不给出我的服务器ip地址,用户和密码了 #数据库使用的是Sql Server 2008,因此driver填写SQL Server Native Client 10.0,其他版本的sql请自行搜索 conn = pyodbc.connect(r'DRIVER={SQL Server Native Client 10.0};SERVER=***.***.***.***,1433;DATABASE=zfzn02;UID=******;PWD=******') cursor = conn.cursor() cursor.execute("select * from accounts") for row in cursor: data = row.photo #对应数据库中的photo字段 account_code = row.account_code #对应数据库的账号字段,也就是手机号 print("saving " + account_code + " ...") image = Image.open(io.BytesIO(data)) path = "photo\\" + account_code + ".png" image.save(path)
可以看到用python编辑的代码,是不是相当简洁~
运行结果
可以看到,每一个image字段中的数据,都被我们导出成了一张张png图片,图片的名字以account_code命名,这也方便了将来我们对图片url的处理。