曾 紅
(四川省自貢市第一人民醫(yī)院,四川 自貢 643000)
在計算機(jī)網(wǎng)絡(luò)應(yīng)用中,會經(jīng)常用文件傳輸協(xié)議(File Transfer Protocol,F(xiàn)TP)來傳遞文件,有時會感到很不方便,于是,本文用MS-SQL數(shù)據(jù)庫來傳遞,編寫應(yīng)用程序,把各類文件存儲到數(shù)據(jù)庫服務(wù)器中,需要時再從數(shù)據(jù)庫中還原文件。
實(shí)現(xiàn)思路:采用microsoft SQL數(shù)據(jù)庫建立一個表,由字段自動遞增(Identity,ID)、文件名稱(nvarchar字符類型)和文件內(nèi)容(text備注類型)字段組成,開發(fā)語言采用Visual FoxPro 9。
(1)數(shù)據(jù)庫名稱為文件管理。(2)IP地址:192.168.0.100。(3)賬號:sa。(4)密碼:123456。(5)數(shù)據(jù)庫建表命令為CREATE TABLE文件(ID int IDENTITY(1,1)NOT NULL,文件名稱nvarchar(100),文件內(nèi)容text NULL)ON [PRIMARY]TEXTIMAGE_ON[PRIMARY]。
rem 創(chuàng)建SQL數(shù)據(jù)庫鏈接[1]
con=sqlstringconnect(“driver=SQL Server;Server=192.168.0.100;Uid=sa;pwd=123456;database=文件管理”)rem 找到需要存儲的文件
rem 關(guān)閉數(shù)據(jù)鏈接,完成存儲
SQLDISCONNECT(con)
rem 創(chuàng)建SQL數(shù)據(jù)庫鏈接
con=sqlstringconnect(“driver=SQL Server;Server=192.168.0.100;Uid=sa;pwd=123456;database=文件管理”)
G=SQLEXEC(con,”select * from 文件”,”文件”)
rem 關(guān)閉數(shù)據(jù)鏈接
SQLDISCONNECT(con)
select 文件
rem 把文件內(nèi)容進(jìn)行base64反編碼
content=STRCONV(文件內(nèi)容,14)
filename=ALLTRIM(文件名稱)
rem 還原文件
STRTOFILE(filename, content)
實(shí)際運(yùn)用中,經(jīng)常遇到大文件,比如視頻、壓縮包等,很多文件大小都在10 M以上,有時可能達(dá)到幾百兆、幾千兆以上。運(yùn)行時,當(dāng)文件換成base64編碼后,數(shù)據(jù)長度如果超過16 777 184字節(jié),程序就會自動切斷超長部分,在還原文件時,長度就變小,還原的文件肯定就是錯誤的。
要解決上面的問題,就必須修改程序,通過反復(fù)思考,決定把文件分成若干塊,再分別存儲到數(shù)據(jù)庫中,即分塊存儲技術(shù),需要還原時,再把這些塊組合起來,即完成還原文件。
對上面程序代碼進(jìn)行改進(jìn),打開文件后,按照12 000 000字節(jié)大小分塊,再轉(zhuǎn)換成base64編碼不會超過16 777 184字節(jié)長,最后,存入數(shù)據(jù)庫中,由于存儲時間較長,程序運(yùn)行時有進(jìn)度提示,實(shí)現(xiàn)代碼如下:
對上面還原程序代碼進(jìn)行改進(jìn),從數(shù)據(jù)庫中讀取出記錄后,把每塊內(nèi)容進(jìn)行base64反編碼,最后,寫入指定的還原文件中,由于存儲時間較長,程序運(yùn)行時有進(jìn)度提示,實(shí)現(xiàn)代碼如下:
當(dāng)文件尺寸小于12 M時,可以直接存儲到數(shù)據(jù)庫中;當(dāng)文件尺寸大于12 M時,就必須采用分塊技術(shù)存儲到數(shù)據(jù)庫。采用VFP9語言編程,完美實(shí)現(xiàn)了超大文件的存儲和還原。為了方便程序調(diào)用,可以進(jìn)一步把程序修改成函數(shù)。