下面是一个发送文件的函数,传输参数是文件名和socket
生成一个压缩包,完成压缩包的发送之后再将生成的压缩包删掉。
在发送一些小的文件(几十kb)的时候是正常的,如下图
退出while循环时会判断条件为false(正常)
但是在发送2MB以上的文件,就会这样
还没发送完,条件依然是true的时候,就跳出了
且后面的
print("总共发送了%s个字节" % send_size)
print("Send:文件发送成功")
都没有执行。
为什么在条件还是true的时候,就突然跳出去了呢?
def file_send(self, conn, filename):
true_name = filename
filepath = self.host_path_list[filename]
# filepath相当于一个URL
if filename.find('.') != -1:
filename = filename[0:filename.find('.')] + ".zip"
else:
filename = filename + ".zip"
z = zipfile.ZipFile(filename, 'w')
# 新建一个zip对象
if os.path.isdir(filepath):
# 如果查询的是子文件夹 就把里面所有的东西压缩进filename.zip
for d in os.listdir(filepath):
z.write(filepath + os.sep + d, d)
else:
# 找到是文件 只用压一个就行了
z.write(filepath, true_name)
z.close()
# 将头部信息封装成json 再编码成bytes
header_dic = {
'filename': filename,
'file_size': z.infolist()[0].file_size
}
header_json = json.dumps(header_dic)
header_bytes = header_json.encode('utf-8')
# 打包文件头
# 把header的长度封装成元组
conn.send(struct.pack('i', len(header_bytes)))
# 发送头
conn.send(header_bytes)
total_size = z.infolist()[0].file_size
# 发送数据
with open(filename, 'rb+') as f:
send_size = 0
while send_size <= total_size:
data = f.read(1024)
conn.send(data)
send_size += len(data)
print("已发送了:%s字节+ %s" % (send_size,(send_size <= total_size)))
print("总共发送了%s个字节" % send_size)
print("Send:文件发送成功")
while True:
# 用于删除之前生成的压缩包
try:
os.remove(filename)
break
except:
continue