前言
继续上文提到的使用Python上传文件到百度网盘的伟大事业。
接口分析
上文我们完成了百度网盘上传的api的封装,通过分析api我得出,需要完成上传4m以上的文件的话,是需要分片上传滴,具体如下图
包括预先上传中的block_list,不用怀疑,这个就是分片文件的md5
文件拆分
以上我们不难看出,放在我们面前必须要做的事情是:文件拆分+md5计算
撸代码
MD5:
# -*- coding: UTF-8 -*-
import hashlib
import os
def get_files_md5(dir_path):
paths = []
md5s = []
for file_name in os.listdir(dir_path):
path = os.path.join(dir_path, file_name)
if not os.path.isdir(path) and not file_name.startswith('.'):
md5 = get_file_md5(path)
paths.append(path)
md5s.append(md5)
return paths, md5s
def get_file_md5(file_name):
m = hashlib.md5() # 创建md5对象
with open(file_name, 'rb') as fobj:
while True:
data = fobj.read(4096)
if not data:
break
m.update(data) # 更新md5对象
return m.hexdigest() # 返回md5对象
def get_slice_md5(file_name):
m = hashlib.md5()
with open(file_name, 'rb') as fobj:
data = fobj.read(256 * 1024)
m.update(data)
return m.hexdigest()
def get_str_md5(content):
m = hashlib.md5(content) # 创建md5对象
return m.hexdigest()
上面展示的是所有文件会使用到的md5的解析,包括这个:
预上传中的头部校验位,别问我为什么要这个参数,问就是我要快传。
湿滴,百度网盘根据你传入的md5和头部校验位来确定,对应的文件是否在云盘中有记录,有的话,直接把这个文件给到你。你就不需要上传了,所谓快传,就是我有哈,你不用传了。
# -*- coding: UTF-8 -*-
import os
kilobytes = 1024
megabytes = kilobytes * 1000
chunksize = int(200 * megabytes) # default chunksize
def split(fromfile, todir, chunksize=chunksize):
if not os.path.exists(todir): # check whether todir exists or not
os.mkdir(todir)
else:
for fname in os.listdir(todir):
os.remove(os.path.join(todir, fname))
paths = []
partnum = 0
inputfile = open(fromfile, 'rb') # open the fromfile
file_name = os.path.basename(fromfile)
while True:
chunk = inputfile.read(chunksize)
if not chunk: # check the chunk is empty
break
partnum += 1
filename = os.path.join(todir, ('%s.part%04d' % (file_name, partnum)))
paths.append(filename)
fileobj = open(filename, 'wb') # make partfile
fileobj.write(chunk) # write data into partfile
fileobj.close()
return paths
上面是拆分文件的代码,没啥技巧,就是循环读,写,简单的一批,当然如果你有兴趣,可以用线程去改写,但是相信我,你上传文件的瓶颈绝对不会在这,除非你在电信/联通/移动总部,哈哈~~~
总结
好啦好啦,要上班撸代码了,下次再说哈。预告一下,下次和大家聊一聊怎么下载一个m3u8的视频。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)