初夏小谈:AI云盘系统

一、做AI云盘系统项目的目的:

解决由于经常将一些以前的文件删除,而现今或者以后可能用到的尴尬境地。

解决云盘下载限速的问题:在本地虚拟机CentOS7上:30M/S~60M/S,在云服务器上:0.2M/S~1M/S

二、AI云盘系统主要功能为

客户端对指定的一个目录进行监听,将比较重要的文件添加到此目录下,系统会自动根据文件的状态信息来对文件进行上传至服务器。并且可以随时随地的进行网页进行浏览以前的文件信息,以及根据需要下载。

三、具体功能:

AI云盘系统功能具体可分为两大块:分别是客户端和服务端两大部分。

客户端与服务端通信的协议是基于HTTP协议。

客户端:

1.首先获取文件的备份信息记录,目的是看看哪些文件已经进行了备份,并将这些文件的大小和修改信息以键值对的形式保存到unordered_map中。

2.接下来对指定的目录进行监听,如果是目录则进行递归监听直到文件被扫描完毕。判断这些文件是否需要上传,通过获取它们的etag信息里面有文件大小和最后一次修改时间。并且将这些信息与unordered_map中存储的修改信息进行对比,如果发生改变则需要上传否则不需上传。

3.当需要上传时,则对文件采取分块上传的方式(提高效率)。将每个块进行记录原位置,并进行组织HTTP请求,设置它的请求方式,上传路径,上传数据长度。之后调用httplib.h中的上传接口实例化客户端对象来向指定的服务端发送PUT请求,利用多线程将这些分块进行上传。

4.在上传完毕后,将这些文件的etag信息保存到unordered_map中。

5.最后将unordered_map中保存的备份文件信息记录刷新到备份文件信息的文件中。

扫描二维码关注公众号,回复: 11573193 查看本文章

在客户端所遇到的问题:

1.在分块上传文件时,起初考虑到如果最后一块不够一个块大小就将它和最后一块进行上传。所以块大小少了一个。这样看似没有问题,但是当文件不够一个块大小时,就会出现问题。导致上传失败。

解决办法:我将开始分块时首先判断是不是可以切分为整块,如果是则正常上传,如果存在不够一个块的情况,将块个数+1,并重新计算最后一个块的末尾位置。这样就可以按照统一方式进行上传。只是根据具体文件大小判断需不需要多创建一个分块来上传就可以了。

2.boost库中函数split分割函数的问题,由于将第三个参数设置为以\n分割。导致的总报错说如图:

解决办法:后查资料没有发现问题,求助老师后,说split分割的第三个参数是以boost::is_any_of("\n")。得以实现

服务端:

1.提供解析对客户端发来的PUT请求信息。并将传来的数据进行备份。

2.服务端对客户端提供获取备份文件列表的功能。

3.服务端对客户端提供对所需文件进行下载的功能

4.服务端每隔一定时间对文件进行判断是否需要进行压缩处理一次,目的使得磁盘空间充分利用。

1.服务端在对客户端发送过来的请求信息进行解析,拿到上传文件路径及range的信息,里面有块大小,起始位置,结束位置。服务端将数据备份到对应位置文件的对应位置上。

2.当客户端通过浏览器浏览备份的文件时。此时服务器通过保存的备份文件信息的列表来获取相应文件名。

3.当客户端需要下载时,此时有两种情况:

情况一:当源文件存在时直接获取源文件内容进行下载。

情况二:当源文件已经被压缩了,此时就需要进行解压后再进行文件内容获取。首先通过文件名在unordered_map保存对应文件及压缩文件信息。找到该压缩文件。之后对文件进行解压到list目录下。再获取文件内容进行下载。

4.每次当服务端起来,就创建一个线程,首先获取,备份压缩文件信息。存储到unordered_map中。接着对list目录下文件进行检测。判断文件文件是否可以压缩。通过该文件的当前时间和stat结构体中保存的文件访问时间之差来进行判断,在这里我设定了两天。为了测试方便设定了10秒。如果大于非压缩时间,就将文件进行压缩,调用zlib.h文件压缩的函数gzwrite。读取源文件,并用gzwrite进行压缩写入。并将压缩的文件信息保存到unordered_map中。

5.最后将unordered_map中的压缩文件信息保存到record.list中。用来记录压缩文件的压缩文件名,以及压缩文件名。

在服务端所遇到问题:

1.当客户端通过浏览器下载文件时,总是打开文件信息,而不进行下载。

这是下载格式的问题:使用:application/octet-stream,使得任意格式文件下载。

2.增加服务器分块上传文件功能,遇到问题:ofstream写入默认截断写入导致前面乱码,改用系统调用接口


四、测试功能:

1.服务器启动,客户端开始监听指定目录:backup

2.向backup目录中添加文件

服务端显示:

3.客户端浏览器查看及下载文件:

4.测试文件是否上传正确:

                                                                                                                                                               珍&源码          

猜你喜欢

转载自blog.csdn.net/IT_xiaoQ/article/details/97627218
今日推荐