一种基于Python的二维码传输系统的设计与实现*
2018-12-28
(南通师范高等专科学校,江苏南通226500)
一、引言
互联时代,各类设备之间的数据实现互联互通。伴随着各类移动应用的大规模普及,人们在智能终端上存储的信息也越来越多,其与计算机设备之间的信息交互也越来越频繁。因此,各类智能设备与计算机设备间的连接工具也犹如雨后春笋。虽然形式多样,但就其传输属性而言,不外乎以下两种:一是通过USB线缆进行物理连接,将智能设备作为U盘挂载使用;二是通过在计算机设备与智能终端上分别安装相应的应用软件,再通过网络进行互联。对于这两种传输方式的主要特征,表1进行了相应的分析。
表1 智能终端与计算机设备数据传输类型特征对比
为了突破物理线缆的束缚,摆脱第三方APP的依赖,同时又让数据传输更为安全、快捷,本文提出了一种基于Python语言进行开发,通过二维码形式进行数据传输的系统实现方法。
二、设计思路
本文所述的基于Python的二维码传输系统设计思路如下:当系统开启下载或上传服务时,系统会将其所在的计算机设备设置为一台提供HTTP服务的临时服务器。程序会将执行共享操作的文件或文件夹的路径生成为一个HTTP形式的网址链接,并将该链接转换成二维码呈现出来。使用者通过智能终端上的二维码扫码工具获取链接信息,再通过自带的浏览器将网址打开,然后进行相应的操作。这条被传输的链接既可以是一个指定下载文件路径的地址,也可以是一个具备浏览服务器指定目录、并提供上传文件接口的网页工作界面,使其不仅具备下载功能,还具备上传功能,从而实现智能设备与计算机设备间数据的双向传输(如图1)。
图1 系统设计思路简图
在此设计思路中,主要用到了以下几个核心概念。
1.二维码
二维码是一种始于上个世纪80年代、并在近几年得到迅猛发展与应用的、通过特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的一种图形编码形式。它可以用于记载网址等信息,通过二维码扫码软件,可以准确、方便地获取其中的信息[1]。Python语言通过qrcode模块可以将相关信息生成为二维码图片。这种快捷、直接、安全的呈现方式加上各类终端都已普及的摄像头硬件,使得二维码传输成为一种流行。
2.HTTP服务器
HTTP服务器是指提供Web服务的计算机,可以通过浏览器等工具根据其公开的地址对其进行访问,并从中获取信息。在该设计思路中,需要将计算机临时变成一台提供HTTP基础服务的服务器。对于一般计算机使用者而言,并不具备配置服务器的能力。Python语言中的http.server库模块可以通过程序设置后提供搭建HTTP服务器的功能,并可以通过CGI功能实现信息的交互[2]。
3.CGI标准
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功能。
三、实现步骤
1.HTTP服务器的实现
本系统实现的关键在于使用Python在使用者的电脑上建立一个临时服务器。只有服务器存在,才可以进行下一步的共享功能的实现。Python中的许多模块提供Web服务器的搭建功能,在这里主要选用http.server模块[4]。该模块可以创建并侦听HTTP套接字,并将请求分派给相应的处理程序。在需要服务器提供CGI功能时,只要为其加载另一个名为CGIHTTPRequestHandler的库就可以了。其功能实现的核心代码如下。
通过以上步骤,执行代码后,就可以在当前计算机上建立一个支持CGI的HTTP服务器。在浏览器中输入地址http://IP:8080可以尝试访问,而程序文件所在的目录也就是当前服务器提供WEB服务的根目录。
2.共享路径的指定
在系统运行时,无论是用户共享单个文件,还是向用户开放的指定目录供其浏览,都需要在建立服务器的同时向服务器传输相关的共享信息。因此,该部分主要是解决共享路径设置的问题。具体实现步骤:当服务器启动时,需要使用者选择服务器的运行模式,即共享文件以供下载或者开放目录自由浏览,同时传输共享的地址或开放的路径,服务器根据用户选择进行设置,并将设置完成后的信息生成为二维码,等待用户进行下一步的操作。具体如图3所示。
图3 服务开启流程图
在该模块中,当使用者输入了共享文件路径或供用户自由浏览的目录后,程序会将其路径写入指定文件中。当后续程序需要使用到路径时,均可以在该文件中进行读取。
3.下载功能的实现
当用户选择了共享单个文件的模式之后,程序会将用于下载的文件的实际地址传送给实现下载功能的相关模块。该模块使用CGI功能,解析地址后,将文件进行输出,使用者则可以通过浏览器下载文件。
此模块中,主要使用的是HTTP应答中Content-D isposition[5]消息头指示回复内容的方法,将attachment指向共享文件,并以filename指定下载时默认文件名。
当浏览器开启下载模式后,以fo=open(targetname,"rb")sys.stdout.buffer.write(fo.read())的方法,将 指 定内容通过浏览器传输到使用者本地设备上。
4.上传功能的实现
文件上传功能实现主要涉及以下几个方面。一是获取待上传文件的相关信息,二是获取文件将要上传到服务器上的位置,三是实现上传。
获取待上传文件信息的方法,是通过HTML表单实现的。用户通过HTML表单选取待上传文件,此时待上传文件的路径及文件名就可以通过POST或GET形式进行提交[6]。获取文件需要上传到的位置的方法较为简单,由于程序在启动时需要用户设置共享位置,且该位置已被记录到了相应的文件中,此时只需使用Python读取文件的功能读取该文档信息即可。文件的上传,同样是使用 CGI功能,通过 Python 的 open(path+fn,'wb').write(item.file.read())语句实现将文件从本地设备写入到服务器指定位置。
5.目录的陈列
目录内容的陈列模块,需要实现以下几项功能。一是要能区分目录与文件,将它们分门别类,并按照顺序陈列在页面上;二是如果对象是目录,要提供进入下一层目录的链接,如果对象是文件,则要显示其大小,并提供下载的链接。
读取当前目录中的对象,可以通过Python语言中的os.listdir(dir_path)来实现。对于读取到的对象则可以通过is_file()函数来区分其为目录或是文件。当判断对象为目录时,则通过Python读取存放操作目录的文件中的当前目录名,将对象目录名加载到当前目录上,作为进入下层目录的链接,供使用者选择点击,在进入下一级目录时,将新的目录路径写入到存放操作目录的文件中保存,以备之后读取;当判断对象为文件时,则通过os.path.getsize()函数获取目标文件的大小,并将其显示出来,同时将该文件名与当前目录路径进行组合,形成绝对路径,将其作为下载地址链接加载到相应按钮上,当点击按钮后,再将其传送到下载模块进行下载操作。
四、总结与展望
通过上述步骤,一个基于Python的二维码传输系统就可以实现。和传统的智能终端与计算机间数据传输的各类形式相比,该系统简洁轻便,功能强大,可跨平台,无需在智能终端上安装特定APP,不依赖于第三方环境,有着实时、高效、安全、跨平台等优势与特点,可以灵活地应用于各类办公场所中。
当然,该系统中依然存在着诸多有待提升的地方,比如使用单个文件存储共享路径会对同一台计算机上的系统使用人数有所限制;文件的上传与下载目前还只能是单个进行,还不能多个文件同时进行或对文件夹进行打包、压缩处理下载以节约网络资源等等。这些功能的拓展将会使该系统变得更为易用,笔者也将在后续开发中陆续跟进。