(南通師范高等專科學校,江蘇南通226500)
互聯時代,各類設備之間的數據實現互聯互通。伴隨著各類移動應用的大規模普及,人們在智能終端上存儲的信息也越來越多,其與計算機設備之間的信息交互也越來越頻繁。因此,各類智能設備與計算機設備間的連接工具也猶如雨后春筍。雖然形式多樣,但就其傳輸屬性而言,不外乎以下兩種:一是通過USB線纜進行物理連接,將智能設備作為U盤掛載使用;二是通過在計算機設備與智能終端上分別安裝相應的應用軟件,再通過網絡進行互聯。對于這兩種傳輸方式的主要特征,表1進行了相應的分析。

表1 智能終端與計算機設備數據傳輸類型特征對比
為了突破物理線纜的束縛,擺脫第三方APP的依賴,同時又讓數據傳輸更為安全、快捷,本文提出了一種基于Python語言進行開發,通過二維碼形式進行數據傳輸的系統實現方法。
本文所述的基于Python的二維碼傳輸系統設計思路如下:當系統開啟下載或上傳服務時,系統會將其所在的計算機設備設置為一臺提供HTTP服務的臨時服務器。程序會將執行共享操作的文件或文件夾的路徑生成為一個HTTP形式的網址鏈接,并將該鏈接轉換成二維碼呈現出來。使用者通過智能終端上的二維碼掃碼工具獲取鏈接信息,再通過自帶的瀏覽器將網址打開,然后進行相應的操作。這條被傳輸的鏈接既可以是一個指定下載文件路徑的地址,也可以是一個具備瀏覽服務器指定目錄、并提供上傳文件接口的網頁工作界面,使其不僅具備下載功能,還具備上傳功能,從而實現智能設備與計算機設備間數據的雙向傳輸(如圖1)。

圖1 系統設計思路簡圖
在此設計思路中,主要用到了以下幾個核心概念。
二維碼是一種始于上個世紀80年代、并在近幾年得到迅猛發展與應用的、通過特定的幾何圖形按一定規律在平面(二維方向上)分布的黑白相間的圖形記錄數據符號信息的一種圖形編碼形式。它可以用于記載網址等信息,通過二維碼掃碼軟件,可以準確、方便地獲取其中的信息[1]。Python語言通過qrcode模塊可以將相關信息生成為二維碼圖片。這種快捷、直接、安全的呈現方式加上各類終端都已普及的攝像頭硬件,使得二維碼傳輸成為一種流行。
HTTP服務器是指提供Web服務的計算機,可以通過瀏覽器等工具根據其公開的地址對其進行訪問,并從中獲取信息。在該設計思路中,需要將計算機臨時變成一臺提供HTTP基礎服務的服務器。對于一般計算機使用者而言,并不具備配置服務器的能力。Python語言中的http.server庫模塊可以通過程序設置后提供搭建HTTP服務器的功能,并可以通過CGI功能實現信息的交互[2]。
CGI(Common Gateway Interface)(通用網關接口),是一個Internet標準,允許Web服務器運行一個服務器端程序,稱為CGI腳本[3]。通過CGI,HTTP服務器提供的不僅僅是靜態的網頁,而是可以與用戶進行交互的動態程序。Python可以作為CGI的腳本在HTTP服務器上進行運行。一般而言,Python中在使用CGI功能時,CGI的腳本都會存放在一個名為cgi-bin的特殊文件夾內,這樣web服務器就知道到哪里查找cgi腳本。CGI在整個Web服務中所處的位置如圖2所示。

圖2 CGI在Web數據處理中的位置
使用CGI的優點在于,用戶可以采用B/S的形式,通過授權的瀏覽器實現對服務器上的文件進行讀寫,并運行程序對服務器內容進行管理。Python語言中的相關模塊可以實現CGI功能。
本系統實現的關鍵在于使用Python在使用者的電腦上建立一個臨時服務器。只有服務器存在,才可以進行下一步的共享功能的實現。Python中的許多模塊提供Web服務器的搭建功能,在這里主要選用http.server模塊[4]。該模塊可以創建并偵聽HTTP套接字,并將請求分派給相應的處理程序。在需要服務器提供CGI功能時,只要為其加載另一個名為CGIHTTPRequestHandler的庫就可以了。其功能實現的核心代碼如下。


通過以上步驟,執行代碼后,就可以在當前計算機上建立一個支持CGI的HTTP服務器。在瀏覽器中輸入地址http://IP:8080可以嘗試訪問,而程序文件所在的目錄也就是當前服務器提供WEB服務的根目錄。
在系統運行時,無論是用戶共享單個文件,還是向用戶開放的指定目錄供其瀏覽,都需要在建立服務器的同時向服務器傳輸相關的共享信息。因此,該部分主要是解決共享路徑設置的問題。具體實現步驟:當服務器啟動時,需要使用者選擇服務器的運行模式,即共享文件以供下載或者開放目錄自由瀏覽,同時傳輸共享的地址或開放的路徑,服務器根據用戶選擇進行設置,并將設置完成后的信息生成為二維碼,等待用戶進行下一步的操作。具體如圖3所示。

圖3 服務開啟流程圖
在該模塊中,當使用者輸入了共享文件路徑或供用戶自由瀏覽的目錄后,程序會將其路徑寫入指定文件中。當后續程序需要使用到路徑時,均可以在該文件中進行讀取。
當用戶選擇了共享單個文件的模式之后,程序會將用于下載的文件的實際地址傳送給實現下載功能的相關模塊。該模塊使用CGI功能,解析地址后,將文件進行輸出,使用者則可以通過瀏覽器下載文件。
此模塊中,主要使用的是HTTP應答中Content-D isposition[5]消息頭指示回復內容的方法,將attachment指向共享文件,并以filename指定下載時默認文件名。
當瀏覽器開啟下載模式后,以fo=open(targetname,"rb")sys.stdout.buffer.write(fo.read())的方法,將 指 定內容通過瀏覽器傳輸到使用者本地設備上。
文件上傳功能實現主要涉及以下幾個方面。一是獲取待上傳文件的相關信息,二是獲取文件將要上傳到服務器上的位置,三是實現上傳。
獲取待上傳文件信息的方法,是通過HTML表單實現的。用戶通過HTML表單選取待上傳文件,此時待上傳文件的路徑及文件名就可以通過POST或GET形式進行提交[6]。獲取文件需要上傳到的位置的方法較為簡單,由于程序在啟動時需要用戶設置共享位置,且該位置已被記錄到了相應的文件中,此時只需使用Python讀取文件的功能讀取該文檔信息即可。文件的上傳,同樣是使用 CGI功能,通過 Python 的 open(path+fn,'wb').write(item.file.read())語句實現將文件從本地設備寫入到服務器指定位置。
目錄內容的陳列模塊,需要實現以下幾項功能。一是要能區分目錄與文件,將它們分門別類,并按照順序陳列在頁面上;二是如果對象是目錄,要提供進入下一層目錄的鏈接,如果對象是文件,則要顯示其大小,并提供下載的鏈接。
讀取當前目錄中的對象,可以通過Python語言中的os.listdir(dir_path)來實現。對于讀取到的對象則可以通過is_file()函數來區分其為目錄或是文件。當判斷對象為目錄時,則通過Python讀取存放操作目錄的文件中的當前目錄名,將對象目錄名加載到當前目錄上,作為進入下層目錄的鏈接,供使用者選擇點擊,在進入下一級目錄時,將新的目錄路徑寫入到存放操作目錄的文件中保存,以備之后讀取;當判斷對象為文件時,則通過os.path.getsize()函數獲取目標文件的大小,并將其顯示出來,同時將該文件名與當前目錄路徑進行組合,形成絕對路徑,將其作為下載地址鏈接加載到相應按鈕上,當點擊按鈕后,再將其傳送到下載模塊進行下載操作。
通過上述步驟,一個基于Python的二維碼傳輸系統就可以實現。和傳統的智能終端與計算機間數據傳輸的各類形式相比,該系統簡潔輕便,功能強大,可跨平臺,無需在智能終端上安裝特定APP,不依賴于第三方環境,有著實時、高效、安全、跨平臺等優勢與特點,可以靈活地應用于各類辦公場所中。
當然,該系統中依然存在著諸多有待提升的地方,比如使用單個文件存儲共享路徑會對同一臺計算機上的系統使用人數有所限制;文件的上傳與下載目前還只能是單個進行,還不能多個文件同時進行或對文件夾進行打包、壓縮處理下載以節約網絡資源等等。這些功能的拓展將會使該系統變得更為易用,筆者也將在后續開發中陸續跟進。