百度云网盘,如何上传大于4G的文件

百度云同步盘的PC客户端,上传文件不能超过4G,可以尝试以下方法解决:


  1. 将文件用WinRar压缩成多个不超过4G大小的文件;

  2. 用BT将文件上传至其他BT服务器,再利用百度云网盘的离线BT下载;

  3. 如果自己有公网的IP,可以在自己电脑上架一个HTTP服务器,再利用百度云网盘离线下载文件;

  4. 利用百度云的API操作


其中3要求比较高,1、2比较切实可行,1的缺点就是不能以单一文件形式展现。

备注:3方法经过尝试,北京联通的光纤宽带分配的IP,架设HTTP服务器后可被外部访问,不过百度云网盘离线下载到1G左右就显示完成,实际文件大小有7G多,由于速度不快未再尝试;长城宽带的IP无法从外部访问

对于喜欢折腾,熟悉BAE和百度云PCS接口的同学,下面介绍方法4,利用百度云提供的REST API上传超过4G的文件。

 

步骤一:获取百度云网盘操作权限


为了能够调用百度云API,需要先在BAE上创建一个应用,记录下client_id和client_secret,并在API列表中开启PCS API权限,允许对网盘进行操作,输入一个目录名transfer,以后的所有操作默认就在网盘的/apps/transfer目录下进行(apps目录对应着网盘中的“我的应用数据”目录)

然后获取access token,第三方应用无需获取用户的用户名和密码就可以访问该用户在网盘transfer目录下的资源:

1.调用下面接口获取授权码your_auth_code

https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=your_client_id&redirect_uri=oob&scope=netdisk
2.再调用下面接口
https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code=your_auth_code&client_id=your_client_id&client_secret=your_client_secret&redirect_uri=oob
3.记录下返回结果中的access_token
{"expires_in":2592000,"refresh_token":"22.789808eb7230d9ab2a4c175c6104803c.315360000.1706593349.1560615390-2066438","access_token":"21.bf2d00b30bf8023a8d7869eb22053292.2592000.1393825349.1560615390-2066438","session_secret":"f1ccf372191cb5299ad7462a8442543d","session_key":"9mnRJvcPWDF5WFP53UpIMgpq\/i8MXrb80TygbU3dVRPRtYhdRE7OHiZiAb8O\/o5Eqqn8CXGJg729xJVe9u5WLm66hI1S\/bPY2w==","scope":"basic netdisk"}
后面会用到access_token进行上传、合并文件的操作  

步骤二:分割本地文件

cygwin下可以通过split工具将大文件分割为1G大小的小文件:
$ split.exe -b 1G -d -a1 bigfile.iso smallfile.iso.
$ ls -lh
总用量 15G
-rwxr-xr-x 1 Administrator None 7.4G 十月  9 2009 bigfile.iso
-rw-r--r-- 1 Administrator None 1.0G 二月  1 12:24 smallfile.iso.0
-rw-r--r-- 1 Administrator None 1.0G 二月  1 12:24 smallfile.iso.1
-rw-r--r-- 1 Administrator None 1.0G 二月  1 12:24 smallfile.iso.2
-rw-r--r-- 1 Administrator None 1.0G 二月  1 12:24 smallfile.iso.3
-rw-r--r-- 1 Administrator None 1.0G 二月  1 12:24 smallfile.iso.4
-rw-r--r-- 1 Administrator None 1.0G 二月  1 12:24 smallfile.iso.5
-rw-r--r-- 1 Administrator None 1.0G 二月  1 12:24 smallfile.iso.6
-rw-r--r-- 1 Administrator None 324M 二月  1 12:24 smallfile.iso.7

 

步骤三:上传分片文件并记录MD5值


通过分片上传API上传smallfile.iso.[0-7]这8个文件,保存每次返回的MD5值,嫌麻烦可以直接从百度云网盘的网页界面“上传文件”,MD5值可以通过本地文件直接计算出来,不放心的可以用meta API查询MD5值和文件大小,再和本地计算得出的MD5和文件大小比对,应该是一致的

注意,这一步不能通过云网盘的PC客户端进行上传,因为客户端上传时会分片,这里需要上传一个完整文件

 

步骤四:合并分片文件


合并分片文件API,根据参数要求,拼接出 url

https://pcs.baidu.com/rest/2.0/pcs/file?method=createsuperfile&access_token=21.bf2d00b30bf8023a8d7869eb22053292.2592000.1393825349.1560615390-2066438&path=%2Fapps%2Ftransfer%2Fbigfile.iso

param参数为

{“block_list”:[“md5_0”,”md5_1”,”md5_2”,”md5_3”,”md5_4”,”md5_5”,”md5_6”,”md5_7”]}

将步骤三中的MD5值分别替换进去,根据API描述,param参数必须放在Http Body中进行传输,发送POST请求后可以在网盘中看到这个新文件了(/apps/transfer/bigfile.iso),大小与本地的bigfile.iso完全一样,但是MD5值有出入,貌似只要是分片了,文件的MD5值就会不一样,可能跟分片有关系,也可能是百度的一个Bug,不过不影响文件的正确性

发送POST请求的工具有很多,我用的是resttesttesthurl也可以,本地命令行工具curl也可以

合并完成后,可以将smallfile.iso.[0-7]这几个文件删除掉,移动bigfile.iso至网盘其它你想要保存的位置

 

后记


根据合并分片文件API 的param参数要求,block_list数组的取值为子文件内容的MD5;子文件至少两个,最多1024个,如果上传的单个文件最大为2G,那么可合并出的最大文件为1024 * 2G = 2T

步骤三提到不能用客户端上传,因为客户端默认是分片上传的,1G的文件会分片成2~4M的分片,这样block_list数组就有256~512个MD5值,8个1G文件再合并,block_list 数组就会超过1024的限制

最后再吐槽一下百度用MD5值唯一标识一个文件分片,这样做的前提是不同文件的MD5值是不同的,也就是说每个文件的MD5值必须是唯一的,但是已经证明MD5不具有唯一性,两个不同文件的MD5可能一样,网上有一款叫做fastcoll的工具,就可以产生两个MD5值一样的不同文件