(南通師范高等專科學(xué)校,江蘇南通226500)
互聯(lián)時(shí)代,各類設(shè)備之間的數(shù)據(jù)實(shí)現(xiàn)互聯(lián)互通。伴隨著各類移動(dòng)應(yīng)用的大規(guī)模普及,人們?cè)谥悄芙K端上存儲(chǔ)的信息也越來(lái)越多,其與計(jì)算機(jī)設(shè)備之間的信息交互也越來(lái)越頻繁。因此,各類智能設(shè)備與計(jì)算機(jī)設(shè)備間的連接工具也猶如雨后春筍。雖然形式多樣,但就其傳輸屬性而言,不外乎以下兩種:一是通過(guò)USB線纜進(jìn)行物理連接,將智能設(shè)備作為U盤掛載使用;二是通過(guò)在計(jì)算機(jī)設(shè)備與智能終端上分別安裝相應(yīng)的應(yīng)用軟件,再通過(guò)網(wǎng)絡(luò)進(jìn)行互聯(lián)。對(duì)于這兩種傳輸方式的主要特征,表1進(jìn)行了相應(yīng)的分析。
表1 智能終端與計(jì)算機(jī)設(shè)備數(shù)據(jù)傳輸類型特征對(duì)比
為了突破物理線纜的束縛,擺脫第三方APP的依賴,同時(shí)又讓數(shù)據(jù)傳輸更為安全、快捷,本文提出了一種基于Python語(yǔ)言進(jìn)行開(kāi)發(fā),通過(guò)二維碼形式進(jìn)行數(shù)據(jù)傳輸?shù)南到y(tǒng)實(shí)現(xiàn)方法。
本文所述的基于Python的二維碼傳輸系統(tǒng)設(shè)計(jì)思路如下:當(dāng)系統(tǒng)開(kāi)啟下載或上傳服務(wù)時(shí),系統(tǒng)會(huì)將其所在的計(jì)算機(jī)設(shè)備設(shè)置為一臺(tái)提供HTTP服務(wù)的臨時(shí)服務(wù)器。程序會(huì)將執(zhí)行共享操作的文件或文件夾的路徑生成為一個(gè)HTTP形式的網(wǎng)址鏈接,并將該鏈接轉(zhuǎn)換成二維碼呈現(xiàn)出來(lái)。使用者通過(guò)智能終端上的二維碼掃碼工具獲取鏈接信息,再通過(guò)自帶的瀏覽器將網(wǎng)址打開(kāi),然后進(jìn)行相應(yīng)的操作。這條被傳輸?shù)逆溄蛹瓤梢允且粋€(gè)指定下載文件路徑的地址,也可以是一個(gè)具備瀏覽服務(wù)器指定目錄、并提供上傳文件接口的網(wǎng)頁(yè)工作界面,使其不僅具備下載功能,還具備上傳功能,從而實(shí)現(xiàn)智能設(shè)備與計(jì)算機(jī)設(shè)備間數(shù)據(jù)的雙向傳輸(如圖1)。
圖1 系統(tǒng)設(shè)計(jì)思路簡(jiǎn)圖
在此設(shè)計(jì)思路中,主要用到了以下幾個(gè)核心概念。
二維碼是一種始于上個(gè)世紀(jì)80年代、并在近幾年得到迅猛發(fā)展與應(yīng)用的、通過(guò)特定的幾何圖形按一定規(guī)律在平面(二維方向上)分布的黑白相間的圖形記錄數(shù)據(jù)符號(hào)信息的一種圖形編碼形式。它可以用于記載網(wǎng)址等信息,通過(guò)二維碼掃碼軟件,可以準(zhǔn)確、方便地獲取其中的信息[1]。Python語(yǔ)言通過(guò)qrcode模塊可以將相關(guān)信息生成為二維碼圖片。這種快捷、直接、安全的呈現(xiàn)方式加上各類終端都已普及的攝像頭硬件,使得二維碼傳輸成為一種流行。
HTTP服務(wù)器是指提供Web服務(wù)的計(jì)算機(jī),可以通過(guò)瀏覽器等工具根據(jù)其公開(kāi)的地址對(duì)其進(jìn)行訪問(wèn),并從中獲取信息。在該設(shè)計(jì)思路中,需要將計(jì)算機(jī)臨時(shí)變成一臺(tái)提供HTTP基礎(chǔ)服務(wù)的服務(wù)器。對(duì)于一般計(jì)算機(jī)使用者而言,并不具備配置服務(wù)器的能力。Python語(yǔ)言中的http.server庫(kù)模塊可以通過(guò)程序設(shè)置后提供搭建HTTP服務(wù)器的功能,并可以通過(guò)CGI功能實(shí)現(xiàn)信息的交互[2]。
CGI(Common Gateway Interface)(通用網(wǎng)關(guān)接口),是一個(gè)Internet標(biāo)準(zhǔn),允許Web服務(wù)器運(yùn)行一個(gè)服務(wù)器端程序,稱為CGI腳本[3]。通過(guò)CGI,HTTP服務(wù)器提供的不僅僅是靜態(tài)的網(wǎng)頁(yè),而是可以與用戶進(jìn)行交互的動(dòng)態(tài)程序。Python可以作為CGI的腳本在HTTP服務(wù)器上進(jìn)行運(yùn)行。一般而言,Python中在使用CGI功能時(shí),CGI的腳本都會(huì)存放在一個(gè)名為cgi-bin的特殊文件夾內(nèi),這樣web服務(wù)器就知道到哪里查找cgi腳本。CGI在整個(gè)Web服務(wù)中所處的位置如圖2所示。
圖2 CGI在Web數(shù)據(jù)處理中的位置
使用CGI的優(yōu)點(diǎn)在于,用戶可以采用B/S的形式,通過(guò)授權(quán)的瀏覽器實(shí)現(xiàn)對(duì)服務(wù)器上的文件進(jìn)行讀寫,并運(yùn)行程序?qū)Ψ?wù)器內(nèi)容進(jìn)行管理。Python語(yǔ)言中的相關(guān)模塊可以實(shí)現(xiàn)CGI功能。
本系統(tǒng)實(shí)現(xiàn)的關(guān)鍵在于使用Python在使用者的電腦上建立一個(gè)臨時(shí)服務(wù)器。只有服務(wù)器存在,才可以進(jìn)行下一步的共享功能的實(shí)現(xiàn)。Python中的許多模塊提供Web服務(wù)器的搭建功能,在這里主要選用http.server模塊[4]。該模塊可以創(chuàng)建并偵聽(tīng)HTTP套接字,并將請(qǐng)求分派給相應(yīng)的處理程序。在需要服務(wù)器提供CGI功能時(shí),只要為其加載另一個(gè)名為CGIHTTPRequestHandler的庫(kù)就可以了。其功能實(shí)現(xiàn)的核心代碼如下。
通過(guò)以上步驟,執(zhí)行代碼后,就可以在當(dāng)前計(jì)算機(jī)上建立一個(gè)支持CGI的HTTP服務(wù)器。在瀏覽器中輸入地址http://IP:8080可以嘗試訪問(wèn),而程序文件所在的目錄也就是當(dāng)前服務(wù)器提供WEB服務(wù)的根目錄。
在系統(tǒng)運(yùn)行時(shí),無(wú)論是用戶共享單個(gè)文件,還是向用戶開(kāi)放的指定目錄供其瀏覽,都需要在建立服務(wù)器的同時(shí)向服務(wù)器傳輸相關(guān)的共享信息。因此,該部分主要是解決共享路徑設(shè)置的問(wèn)題。具體實(shí)現(xiàn)步驟:當(dāng)服務(wù)器啟動(dòng)時(shí),需要使用者選擇服務(wù)器的運(yùn)行模式,即共享文件以供下載或者開(kāi)放目錄自由瀏覽,同時(shí)傳輸共享的地址或開(kāi)放的路徑,服務(wù)器根據(jù)用戶選擇進(jìn)行設(shè)置,并將設(shè)置完成后的信息生成為二維碼,等待用戶進(jìn)行下一步的操作。具體如圖3所示。
圖3 服務(wù)開(kāi)啟流程圖
在該模塊中,當(dāng)使用者輸入了共享文件路徑或供用戶自由瀏覽的目錄后,程序會(huì)將其路徑寫入指定文件中。當(dāng)后續(xù)程序需要使用到路徑時(shí),均可以在該文件中進(jìn)行讀取。
當(dāng)用戶選擇了共享單個(gè)文件的模式之后,程序會(huì)將用于下載的文件的實(shí)際地址傳送給實(shí)現(xiàn)下載功能的相關(guān)模塊。該模塊使用CGI功能,解析地址后,將文件進(jìn)行輸出,使用者則可以通過(guò)瀏覽器下載文件。
此模塊中,主要使用的是HTTP應(yīng)答中Content-D isposition[5]消息頭指示回復(fù)內(nèi)容的方法,將attachment指向共享文件,并以filename指定下載時(shí)默認(rèn)文件名。
當(dāng)瀏覽器開(kāi)啟下載模式后,以fo=open(targetname,"rb")sys.stdout.buffer.write(fo.read())的方法,將 指 定內(nèi)容通過(guò)瀏覽器傳輸?shù)绞褂谜弑镜卦O(shè)備上。
文件上傳功能實(shí)現(xiàn)主要涉及以下幾個(gè)方面。一是獲取待上傳文件的相關(guān)信息,二是獲取文件將要上傳到服務(wù)器上的位置,三是實(shí)現(xiàn)上傳。
獲取待上傳文件信息的方法,是通過(guò)HTML表單實(shí)現(xiàn)的。用戶通過(guò)HTML表單選取待上傳文件,此時(shí)待上傳文件的路徑及文件名就可以通過(guò)POST或GET形式進(jìn)行提交[6]。獲取文件需要上傳到的位置的方法較為簡(jiǎn)單,由于程序在啟動(dòng)時(shí)需要用戶設(shè)置共享位置,且該位置已被記錄到了相應(yīng)的文件中,此時(shí)只需使用Python讀取文件的功能讀取該文檔信息即可。文件的上傳,同樣是使用 CGI功能,通過(guò) Python 的 open(path+fn,'wb').write(item.file.read())語(yǔ)句實(shí)現(xiàn)將文件從本地設(shè)備寫入到服務(wù)器指定位置。
目錄內(nèi)容的陳列模塊,需要實(shí)現(xiàn)以下幾項(xiàng)功能。一是要能區(qū)分目錄與文件,將它們分門別類,并按照順序陳列在頁(yè)面上;二是如果對(duì)象是目錄,要提供進(jìn)入下一層目錄的鏈接,如果對(duì)象是文件,則要顯示其大小,并提供下載的鏈接。
讀取當(dāng)前目錄中的對(duì)象,可以通過(guò)Python語(yǔ)言中的os.listdir(dir_path)來(lái)實(shí)現(xiàn)。對(duì)于讀取到的對(duì)象則可以通過(guò)is_file()函數(shù)來(lái)區(qū)分其為目錄或是文件。當(dāng)判斷對(duì)象為目錄時(shí),則通過(guò)Python讀取存放操作目錄的文件中的當(dāng)前目錄名,將對(duì)象目錄名加載到當(dāng)前目錄上,作為進(jìn)入下層目錄的鏈接,供使用者選擇點(diǎn)擊,在進(jìn)入下一級(jí)目錄時(shí),將新的目錄路徑寫入到存放操作目錄的文件中保存,以備之后讀取;當(dāng)判斷對(duì)象為文件時(shí),則通過(guò)os.path.getsize()函數(shù)獲取目標(biāo)文件的大小,并將其顯示出來(lái),同時(shí)將該文件名與當(dāng)前目錄路徑進(jìn)行組合,形成絕對(duì)路徑,將其作為下載地址鏈接加載到相應(yīng)按鈕上,當(dāng)點(diǎn)擊按鈕后,再將其傳送到下載模塊進(jìn)行下載操作。
通過(guò)上述步驟,一個(gè)基于Python的二維碼傳輸系統(tǒng)就可以實(shí)現(xiàn)。和傳統(tǒng)的智能終端與計(jì)算機(jī)間數(shù)據(jù)傳輸?shù)母黝愋问较啾?,該系統(tǒng)簡(jiǎn)潔輕便,功能強(qiáng)大,可跨平臺(tái),無(wú)需在智能終端上安裝特定APP,不依賴于第三方環(huán)境,有著實(shí)時(shí)、高效、安全、跨平臺(tái)等優(yōu)勢(shì)與特點(diǎn),可以靈活地應(yīng)用于各類辦公場(chǎng)所中。
當(dāng)然,該系統(tǒng)中依然存在著諸多有待提升的地方,比如使用單個(gè)文件存儲(chǔ)共享路徑會(huì)對(duì)同一臺(tái)計(jì)算機(jī)上的系統(tǒng)使用人數(shù)有所限制;文件的上傳與下載目前還只能是單個(gè)進(jìn)行,還不能多個(gè)文件同時(shí)進(jìn)行或?qū)ξ募A進(jìn)行打包、壓縮處理下載以節(jié)約網(wǎng)絡(luò)資源等等。這些功能的拓展將會(huì)使該系統(tǒng)變得更為易用,筆者也將在后續(xù)開(kāi)發(fā)中陸續(xù)跟進(jìn)。