某药检管理所管理员因为懒,远程3389设置了弱密码,然后被黑了,服务器卡的不行了才发现被黑,竟然有了奇操作,重新改了个密码就完事了,之后没过4天,整个服务器被勒索加密了,我去看的时候发现服务器内容已经无药可救了,原因是6月份的时候因为断电原因,导致内网NAS挂了,也没管, 好久之后换了两块硬盘,因为加密原因首先考虑的就是数据恢复,恢复的时候什么也没有了。

因为单位有规定,服务器要自动备份还需要人工备份,管理员不专业,备份文件也在服务器上,同样被加密了,再之后开始找其他手工备份文件,在一个移动硬盘发现一年前的备份,网上花了1000块钱修复了数据库,进行替换,最后开始项目恢复,流程重建补充,进行补录数据,前前后后用了20多天的时间,最后对比数据丢失了7条实在无法找回。因为程序流程有年底归档,文件归档后附件合并,由于没有原始数据和子附件,也没有办法补充归档附件。最后1个多TB的数据,恢复不到400G。

授予此次事件影响,决定搞个安全备份工具(就是内网+外网的双备份)。外网考虑过独立外网服务器,包括腾讯百度阿里 云服务器和云存储,机房托管服务器,然后按存储大小计算成本实在是高的有点受不了(因为平台系统装了很多个单位,计算的时候文件会超过PB级的),最后决定试试申请百度云API,竟然一下子就通过了,然后开始折腾,出现几个状况,在这里进行解释一下给有需要的人

备份原理如下

1 监听扫描指定目录 发现新文件或修改文件进行上传

2 上传前检查云盘是否存在同一MD5文件

如果存在 且 MD5不同 则移动云盘文件到历史记录的同名文件夹 再上传新文件

流程上来说不算难 但是百度API post传参有几个问题 也没找到可供交流和讨论的地方 只能自己解决了

首先云API说的是 文件上传分为三个阶段:预上传、分片上传、创建文件。只有完成这三步,才能将文件上传到网盘。

开始小文件上传测试没问题 一遍全过,但是大文件的时候就有问题了

第一 预上传就出现问题  按着API说明

1、rtype=0时,如果云端存在同名文件,此次调用会失败

2、云端文件重命名策略:假设云端文件为test.txt,新的名称为test(1).txt

3、content_md5和slice_md5都不为空时,接口会判断云端是否已存在相同文件,如果存在,返回的return_type=2

新文件上传返回return_type值就有问题的 , 不知道是因为没有说明白还是这是个BUG问题,看见的各位可以自己自行测试,因为这个问题我研究了差不多一天半,才发现重现这个问题的方式。

1.先上传一个从来没有上传过的文件到百度云盘,上传成功 这个时候 return_type返回1

2.重新上传一遍这个文件,因为已经上传过该文件,云盘也同样存在该文件 按说明则应该 return_type返回2 但是 return_type还是返回1 接着开始分片上传 这个时候又重新上传了一遍该文件 接着创建文件 返回的就是错误的 提示-8 代表文件已经存在了 

按百度云盘的API https://pan.baidu.com/union/document/upload#%E9%A2%84%E4%B8%8A%E4%BC%A0 说明 预上传这里应该直接返还return_type=2 因为错误的返回导致文件又重新上传一遍 小文件没事 大文件就是纯浪费时间 我现在是通过搜索文件请求参数进行判断进行处理的 目前只能这样多一次的API请求了)

3.重现API ,云盘上删除刚才上传的文件,在重新上传,这个时候正常了 return_type 返回2 ,网盘删除的文件又出现了,秒传就是这么实现的 ,这里因为把文件删除了导致API又正常了。

接下来是参数说明

预上传
接口说明POST https://pan.baidu.com/rest/2.0/xpan/file?method=precreate
请求参数参数名 类型  必需  描述
path    string  是   上传后使用的文件绝对路径
size    string  是   文件或目录的大小,单位B
isdir   string  是   是否目录,0 文件、1 目录
autoinit    int 是   固定值1
rtype   int 否   文件命名策略,默认0
0 为不重命名,返回冲突
1 为只要path冲突即重命名
2 为path冲突且block_list不同才重命名
3 为覆盖
uploadid    string  否   上传id
block_list  json array  是   文件各分片MD5的json串
content-md5 string  否   文件MD5
slice-md5   string  否   文件校验段的MD5,校验段对应文件前256KB
local_ctime string  否   客户端创建时间, 默认为当前时间戳
local_mtime string  否   客户端修改时间,默认为当前时间戳

content_md5和slice_md5都不为空时,接口会判断云端是否已存在相同文件,如果存在,返回的return_type=2

想要先判断文件存在与不存在 需要在预上传是添加 content_md5和slice_md5  此时如果文件存在才会返回 return_type=2

其中 content_md5 是文件本身的MD5值 这个是好取回的 也对比是正常的

slice_md5 是麻烦的,这个不能用网上搜索到的 slicemd5 方法实现 没有一个是正确的

正确读取slice_md5是 打开文件 按字节读取 0到254*1024个字节 然后直接md5加密 或 者保存为文件 在读取文件md5值 两种皆可以实现 想要确认slice_md5是不是对的  两种方法都实现 对比md5值一样就可以了

另外如果文件小于256kb 则按文件大小读取 其实就是文件本身的md5值

这样的文件 block_list、content-md5、slice-md5 是一样的 因为官网没有做出详细说明 这些都是我测试出来的 想判断自己提供的参数对不对只要用一个小于256kb的文件就能测试出来了

就到这里吧 下班了 剩下的几个问题留着下次等待下班时又不让自己看起来很闲的时候在写

其实百度云API还是很好的 超级会员一年300块钱还是很值的 用于自定义文件备份是超级划算的。

剩下的主要注意问题就是post请求 ,像get什么的基本是没有什么错误的

补充一下slice_md5 加密

/// <summary>/// 文件校验段的MD5,校验段对应文件前256KB/// </summary>/// <param name="fileName">文件绝对路径</param>/// <returns>MD5值</returns>public static string File_md5_Slice(string path){Int32 bytes = 1024 * 256;try{FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read);//读取文件Debug.WriteLine(fs.Length);if(fs.Length < bytes){fs.Close();return File_md5(path);}byte[] buffer = new byte[bytes];fs.Read(buffer, 0, bytes);fs.Close();MD5 md5 = new MD5CryptoServiceProvider();byte[] retVal = md5.ComputeHash(buffer);StringBuilder sb = new StringBuilder();for (int i = 0; i < retVal.Length; i++){sb.Append(retVal[i].ToString("x2"));}string md5_val = sb.ToString();//BitConverter.ToString(output).Replace("-", "")//System.Diagnostics.Debug.WriteLine(md5_val);return md5_val;}catch (Exception ex){throw new Exception("Get_File_Md5_Slice() fail,error:" + ex.Message);}}

百度云盘API文件上传参数详解相关推荐

  1. Pikachu靶场之文件上传漏洞详解

    Pikachu靶场之文件上传漏洞详解 前言 文件上传漏洞简述 什么是文件上传漏洞? 文件上传的原理 文件上传漏洞有哪些危害 文件上传漏洞如何查找及判断 文件上传如何防御 文件上传漏洞绕过的方式有哪些 ...

  2. java formfile_基于Struts文件上传(FormFile)详解

    Struts中FormFile用于文件进行上传 1.在jsp文件中进行定义 名字: 头像: 2.在Form表单中定义FormFile /* * Generated by MyEclipse Strut ...

  3. FastDFS的配置、部署与API使用解读(8)FastDFS多种文件上传接口详解(转)

    1.StorageClient与StorageClient1的区别 相信使用happy_fish的FastDFS的童鞋们,一定都熟悉StorageClient了,或者你熟悉的是StorageClien ...

  4. php文件上传详解,PHP文件上传实例详解!!!

    这篇文章主要介绍了PHP文件上传实例代码,需要的朋友可以参考下 首先来看下上传部分的表单代码: 文件:  这里有几个要注意的地方,首先看这句 ,这里我们采用POST方法,个别浏览器还支持PUT方法,当 ...

  5. jquery组件WebUploader文件上传用法详解

    这篇文章主要为大家详细介绍了jquery组件WebUploader文件上传用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 WebUploader是由Baidu WebFE(FEX)团队开发的一 ...

  6. 【网络安全】文件上传漏洞 详解

    文件上传漏洞 1.什么是文件上传 将客户端数据以文件形式封装,通过网络协议发送到服务器端.在服务器端解析数据,最终在服务端硬盘上作为真实的文件保存. 通常一个文件以HTTP协议进行上传时,将POST请 ...

  7. 文件上传漏洞详解(CTF篇)

    需要了解的前置知识: 1.什么是文件上传: 文件上传就是通过流的方式将文件写到服务器上 文件上传必须以POST提交表单 表单中需要 <input type="file" na ...

  8. 后端文件上传逻辑详解

    路径问题 因为开发时和部署时的系统不同,所以文件路径应该是可装配的,最好写在配置文件中,通过**@Value**注解来动态获取. //配置文件 community.path.domain=http:/ ...

  9. java web文件上传详解_java web图片上传和文件上传实例详解

    java web图片上传和文件上传 图片上传和文件上传本质上是一样的,图片本身也是文件.文件上传就是将图片上传到服务器,方式虽然有很多,但底层的实现都是文件的读写操作. 注意事项 1.form表单一定 ...

最新文章

  1. HashMap数据类型使用注意-不能使用基本数据类型
  2. Flume的Collector
  3. Python之区块链入门,揭秘比特币
  4. android 自定义刷新控件,Android开发中MJRefresh自定义刷新动画效果
  5. 春节特惠活动┃强烈推荐!孩子的科普从这套全球畅销250万册的最酷科学书起步...
  6. 单片机led闪烁代码_单片机驱动LED发光二极管的电路以及编程
  7. android - startActivity浅谈
  8. 中国工业机器人市场正在迎来爆发式增长
  9. 禁止电脑任何软件弹出窗口
  10. 2018CUMCM(数学建模国赛)_B——智能RGV的动态调度策略
  11. Farrago for Mac 1.1.0 音频效果和音乐剪辑工具 破解版下载
  12. SYN包与SYN攻击原理
  13. 对JavaWeb项目中WEB-INF目录的理解
  14. word页脚显示不全
  15. 游戏感:虚拟感觉的游戏设计师指南——第十三章 超级马里奥兄弟
  16. 对 Viper RGB 驱动多个缓冲区溢出漏洞的分析
  17. K8S(02)管理核心资源的三种基本方法
  18. 同步计数器与异步计数器的区别,以及4040计数器的使用
  19. echart图和easyui图表制作模版制作
  20. APISpace 周公解梦API接口 免费好用

热门文章

  1. b站选择HTML5播放器,b站用什么播放器看片好?选择硬解还是软解?看本地视频首选哪一个?...
  2. B站网页视频加速设置
  3. WXML和HTML的区别
  4. openvino杂烩
  5. Linux编译器-gcc/g++的使用
  6. 生成全排列算法的实现(Johnson-Trotter)
  7. Java中在指定范围内生成整型、长整型、双精度随机数流
  8. 关于java字符流Reader.read()方法的个人理解
  9. node.js实现图片裁剪+获取图片大小+加logo水印
  10. log4j/log4e的使用