本发明属于文件传输技术领域,特别涉及一种Linux服务端与windows客户端之间跨平台传输文件的实现方法。
背景技术:
Windows与Linux是目前最流行的两种操作系统。基于Linux运行稳定、功能强大、获取方便等优点因素的考虑,仍是作为很多项目中服务器的优选。
文件传输是操作系统中常见的行为活动,Linux也提供了文件传输的工具,其中包括vsftp服务实现linux端的文件上传下载,并有相关的接口实现。
目前的传输技术存在着如下不足:
(I)现有的vsftp服务虽然提供了文件上传下载指令接口(STOR与RETR),但无法满足与windows客户端间的文件上传与下载。
(II)主要缺失windows客户端一些指令的实现,如MLST指令,导致无法正常通信。
技术实现要素:
本发明的目的,在于提供一种Linux服务端与windows客户端之间跨平台文件的传输方法,其可实现vsftp服务缺失的指令功能,解决linux端vsftp服务与一些常见的windows客户端间的文件通信,以支持windows客户端与linux搭建的服务端间跨平台文件上传下载。
为了达成上述目的,本发明的解决方案是:
一种Linux服务端与windows客户端之间跨平台文件的传输方法,包括如下步骤:
步骤1,将接收到的指令ftp_cmd_str与“MLST”比对,判断vsftp服务是否接收到MLST指令,如果接收到该指令则开始查询文件目录,进入步骤2,否则处理接收到的其它指令的业务,不进入后续步骤;
步骤2,根据接收到的MLST指令,先获得文件/文件夹的路径与文件权限,拼接得到文件/文件夹信息串,转步骤3;
步骤3,根据步骤2得到的返回结果,通过vsftp与客户端发送指令的接口vsf_cmdio_write_char将结果发送到客户端;
步骤4,发送成功后,给客户端发送250End消息,表示MLST动作结束,客户端收到250End消息,进入步骤5;
步骤5,客户端向linux服务器发送STOR或RETR指令,服务器根据指令对文件进行上传或下载操作。
上述步骤2的具体内容是:
步骤21,根据接收到的MLST指令,查询要进行处理的文件/文件夹,若未查询到,则返回权限值PERMISSION_INVALIDNAME,转步骤3;若查询到,则获取其相应的路径,转步骤22;
步骤22,根据当前用户信息和传入的指令,构造函数接口进行判断获取得到文件的权限,如果权限异常则转步骤3,否则转步骤23;
步骤23,拼接获取文件/文件夹信息串。
上述步骤23中,文件/文件夹信息串的形式是:文件类型,文件大小,文件最后修改时间,路径名;步骤23的具体内容是:
步骤231,根据步骤22得到的文件权限值,如果为PERMISSION_FILENOTDIR,得到子串type=file,如果权限为PERMISSION_DIRNOTFILE,则得到子串type=dir;
步骤232,计算获得文件的大小,得到子串size=%I64d,其中%I64d为size值类型;
步骤233,获取文件最后修改的时间,得到子串:
modify=%04d%02d%02d%02d%02d%02d
步骤234,最终整理拼接文件/文件夹信息串,格式为:
文件类型:type=file;size=%I64d;modify=%04d%02d%02d%02d%02d%02d路径名;
文件夹类型:type=dir;size=%I64d;modify=%04d%02d%02d%02d%02d%02d路径名。
上述步骤3的具体内容是:若步骤21返回文件不存在,或步骤22返回文件权限异常,则通过接口将550Permission denied/550Filename invalid/550directory not found发送到客户端,然后中止退出,其中,550Permission denied表示用户无操作权限,550Filename invalid表示无效路径名,550directory not found表示存在其他错误;否则,结合步骤21返回的路径和步骤23返回的文件/文件夹信息串,将“250-Listing+文件/文件夹的路径”拼接通过接口发送给客户端,再将“文件/文件夹信息串”发送到客户端,再转步骤4。
上述步骤5中,服务器操作完成后,向客户端反馈文件操作结果,操作结果包括550表示异常,返回250表示成功。
现有方案只实现vsftp在Linux端的通信实现文件的上传下载,没有考虑到跨平台情况常见的windows客户端间兼容性,采用上述方案后,本发明能够实现这部分缺失,实现vsftp文件目录内容的检索,且支持与常见windows客户端间文件上传下载功能。
附图说明
图1是本发明的流程图。
具体实施方式
以下将结合附图,对本发明的技术方案及有益效果进行详细说明。
如图1所示,本发明提供一种Linux服务端与windows客户端之间跨平台文件的传输方法,主要完成接收到STOR(处理上传)或RETR(处理下载)指令之前的MLST指令处理,列出指定目录内容,通过与客户端间的发送指令接口vsf_cmdio_write或vsf_cmdio_write_char返回结果给客户端;所述传输方法具体包括如下步骤:
步骤1,将接收到的指令ftp_cmd_str与“MLST”比对,判断vsftp服务是否接收到MLST指令,如果接收到该指令则开始查询文件目录,进入步骤2,否则处理接收到的其它指令的业务,不进入后续步骤;
步骤2,根据接收到的MLST指令,先获得文件/文件夹的路径与文件权限,拼接得到文件/文件夹信息串,转步骤3;
具体内容是:
步骤21,根据接收到的MLST指令,查询要进行处理的文件/文件夹,若未查询到,则返回权限值PERMISSION_INVALIDNAME,转步骤3;若查询到,则获取其相应的路径(用于步骤23中拼接信息串),转步骤22;
步骤22,根据当前用户信息和传入的指令,构造函数接口进行判断获取得到文件的权限,如果权限异常(返回值非0)则转步骤31,否则转步骤23;
其中,文件权限包括:
PERMISSION_DENIED(0x01),//根据当前用户信息,判断是否有当前用户权限
PERMISSION_NOTFOUND(0x02),//未找到该文件/文件夹
PERMISSION_DIRNOTFILE(0x04|PERMISSION_DOESALREADYEXIST),//为文件夹
PERMISSION_FILENOTDIR(0x08|PERMISSION_DOESALREADYEXIST),//为文件
PERMISSION_DOESALREADYEXIST(0x10),//该文件/文件夹已经存在
PERMISSION_INVALIDNAME(0x20),//该文件/文件夹名无效
0(正常返回值)。
步骤23,拼接获取文件/文件夹信息串:
文件类型(文件夹或普通文件),文件大小,文件最后修改时间,路径名。其中最后修改时间与文件名之间用空格分割。
具体内容是:
步骤231,根据步骤22得到的文件权限值,如果为PERMISSION_FILENOTDIR,得到子串type=file,如果权限为PERMISSION_DIRNOTFILE,则得到子串type=dir;
步骤232,计算获得文件的大小,得到子串size=%I64d,其中%I64d为size值类型;
步骤233,获取文件最后修改的时间,得到子串:
modify=%04d%02d%02d%02d%02d%02d
步骤234,最终整理拼接文件/文件夹信息串,格式如:
文件类型:type=file;size=%I64d;modify=%04d%02d%02d%02d%02d%02d路径名;
文件夹类型:type=dir;size=%I64d;modify=%04d%02d%02d%02d%02d%02d路径名;
步骤3,根据步骤2中得到的返回结果,此处返回结果包括步骤22返回的权限和步骤23返回的文件/文件夹信息串,通过vsftp与客户端发送指令的接口vsf_cmdio_write_char将结果发送到客户端;
具体包括如下两种情况:
若文件不存在或文件权限异常,则通过接口将550Permission denied/550Filename invalid/550directory not found发送到客户端,然后中止退出。其中,550Permission denied表示用户无操作权限,550Filename invalid表示无效路径名,550directory not found表示存在其他错误。
如果文件权限正常(正常返回0),将“250-Listing+文件/文件夹的路径”拼接通过接口发送给客户端,再将“文件/文件夹信息串”发送到客户端,再转步骤4;
步骤4,上述结果发送成功,给客户端发送250End消息,表示MLST动作结束,客户端会收到250End消息,进入步骤5;
步骤5,客户端根据需要,向linux服务器(vsftpd服务)发送STOR或RETR指令,服务器接收到STOR(接收数据并且在服务器站点保存为文件)或RETR(传输文件副本)指令,对文件进行上传或下载操作。向客户端反馈文件操作结果,操作结果包括550表示异常,返回250表示成功。流程结束。
以上实施例仅为说明本发明的技术思想,不能以此限定本发明的保护范围,凡是按照本发明提出的技术思想,在技术方案基础上所做的任何改动,均落入本发明保护范围之内。