本篇內容來自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的處理。
