公司业务,需要实现一个ftp大文件上传的功能,简单搭建一个ftp服务器,首先研究demo,以及断点上传的功能。
1:首先了解文件上传相关协议,ftp,sftp或者基于http,其他自己实现等。
2:确定基于ftp实现,搭建简单的ftp服务器并用工具确定服务器正常。
3:基于现有的服务器,了解相关ftp开源库,使用代码实现文件上传最基本的功能。
4:考虑到大文件的传输,首先考虑断点续传功能,后期用线程池/多线程方案进行适配优化。
5:考虑使用场景,适配在windows上进行测试,基于qt。
sftp基于ssh进行远程传输,基于ssh通道进行数据传输,默认使用22端口。
ftp需要单独配置ftp服务器,比如linux上安装vsftpd,windows上安装FileZilla Server,默认使用20/21端口传输
21端口是控制信息端口,20端口一般数据传输端口,可以协商。
主动方式 ftp客户端开放端口给服务器,连接上21端口后,由服务器主动连接开放端口,可能被防火墙阻塞。
被动方式 服务器开放另外的数据端口给客户端,客户端直接连接进行数据传输。
这里我ubuntu环境使用vsftpd进行安装,安装后正常启动,需要关注配置文件中,/etc/vsftpd.conf,下面的配置,否则一直上传有报错。
local_enable=YES
write_enable=YES
这里我使用xftp连接我的ftp服务器,21端口,使用ftp进行上传(sftp基于ssh,原理不一样),这次测试成功,即基于工具测试ftp服务器成功。
因为我比较熟悉linux,首先参考网络,或者libcurl开源库下的example中测试用例,实现最基本的上传文件成功。
这里遇到的问题是,参考网络时,url都是域名,使用自己搭建的ftp时,需要注意url的设置正确,以及这里登陆用户是我自己的账号,根目录也就是/home/用户名,否则会报错。
经过了解,libcurl是最好实现该方案的开源库,暂时确定以该库入手实现功能。
5.1 首先获取libcurl开源库源码,编译完成后,了解相关目录架构,参考example目录下相关demo,了解相关基本接口。
5.2 获取libcurl的windows版本,这里直接从官网获取,基于qt进行测试
5.2.1 首先,获取到release版本后,直接解压在对应目录,需要在qt项目中,链接对应的头文件和lib库,使代码编译能通过。
同时: 代码实现时能正常调用到libcurl的库,但是运行无反应。
需要把libcurl对应的链接库拷贝到qt 项目debug/release运行目录下,取libcurl release版本目录下bin目录下libcurl.dll。
5.2.2 实现简单的界面,测试服务器连接正常,
服务器连接测试demo:
5.2.3 测试单个文件上传正常
5.2.4 如果服务器上已经有该文件,并且上传一半,测试断点续传功能正常。
===》这里我阻塞一段时间,参考example下的resume代码,一直无法实现,最后发现获取服务器上文件名称定义的CURL 实例,需要和真正上传文件时CURL实例
1:断点续传一直不生效,发现是设置CURLOPT_NOBODY 和CURLOPT_HEADER 后,就不会触发上传。
===》解决方案是获取服务器上对应文件大小后,先清理对应的CURL * 再进行设置就好
2:模拟断点续传时,手动在linux上把目标文件进行部分内容的删除。
===》断点续传再次触发后,发现和源文件相比,两次上传之间有个换行。
===》解决方案,发现是linux环境手动删除时,自带一个换行符号,把该文件传到window环境上删除换行符后正常。
只是第一版初步的探索demo,技术点已经攻克,下一步优化代码。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/15134.html