Python-对ZIP处理

需求:对方提供处理文件的接口,本地将待处理文件压缩后,通过http post multipart方式上传,等待处理完成后从相应连接下载结果

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import os
import time
import zipfile
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder


class FuncZip(object):

def __init__(self):
self.remote_result = 0

# 压缩文件
def zip_dir(self, dirname, zipfilename):
filelist = []
if os.path.isfile(dirname):
filelist.append(dirname)
else:
for root, dirs, files in os.walk(dirname):
for name in files:
filelist.append(os.path.join(root, name))
zf = zipfile.ZipFile(zipfilename, mode="w", compression=zipfile.zlib.DEFLATED, allowZip64=True)
for tar in filelist:
arcname = tar[len(dirname):]
zf.write(tar, arcname)
zf.close()

# 解压文件
def unzip_file(self, zipfilename, unziptodir):
if not os.path.exists(unziptodir):
os.mkdir(unziptodir)
zfobj = zipfile.ZipFile(zipfilename)
for name in zfobj.namelist():
# name = name.replace('\', '/')
if name.endswith('/'):
os.mkdir(os.path.join(unziptodir, name))
else:
ext_filename = os.path.join(unziptodir, name)
ext_dir = os.path.dirname(ext_filename)
if not os.path.exists(ext_dir):
os.mkdir(ext_dir)
outfile = open(ext_filename, 'wb')
outfile.write(zfobj.read(name))
outfile.close()

# 下载
def download_result(self, filename):
filename = "xxx/xxx"
# filename.replace('\', '/')
file = filename.split('/')[-1]
URL = '--------------'
re = requests.get(URL+'?name='+file, stream=True)
self.remote_result = re.status_code
if self.remote_result == 200:
print("find result,try to download")
f = open("download_"+file, "wb")
for chunk in re.iter_content(chunk_size=512):
if chunk:
f.write(chunk)
print("download result success")
return self.remote_result

# 上传
def upload_zip(self, filename):
self.remote_result = 0
filename = "xxx/xxx"
file = filename.split('/')[-1]
file_tup = (file, open(filename, 'rb'), 'application/zip')
URL = '-----------------'

#fields属性根据对方接口说明设置
m = MultipartEncoder(
fields={'name': file, 'zipfile': file_tup}
)

re = requests.post(URL, data=m, headers={'Content-Type': m.content_type})
self.remote_result = re.status_code
if self.remote_result == 200:
print("upload success")
else:
print("upload failed")
return self.remote_result

http协议本身的原始方法不支持multipart/form-data请求,这个请求由原始方法演变而来的。
multipart/form-data的基础方法是post,也就是说是由post方法来组合实现的,与post方法的不同之处:请求头,请求体。
multipart/form-data的请求头必须包含一个特殊的头信息:
Content-Type,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中的多个post的内容,如文件内容和文本内容自然需要分割开来,不然接收方就无法正常解析和还原这个文件了。

具体的头信息如下:

1
Content-Type: multipart/form-data; boundary=${bound}