Это функция для отправки файла, параметрами которого являются имя файла и сокет. Перед отправкой файла он сгенерирует zip-файл, который будет удален после отправки.
При отправке небольших файлов (десятки килобайт) , ситуация нормальная, как показано ниже. При выходе из while l oop, условие оценивается как ложное
Нормальная ситуация, нажмите и посмотрите
Но при отправке файлов размером более 2МБ возникает такая ошибка : Файл не было отправлено, и условие по-прежнему выполняется, выскакивает l oop
Ситуация с ошибкой, щелкните и посмотрите
Более того , следующие две строки кода не выполняются
print("总共发送了%s个字节" % send_size)
print("Send:文件发送成功")
Почему l oop заканчивается внезапно, когда условие все еще выполняется? В результате файлы немного большего размера не могут быть переданы вообще.
Большое спасибо!
Исходный код :
def file_send(self, conn, filename):
true_name = filename
filepath = self.host_path_list[filename]
# filepath is a URL
if filename.find('.') != -1:
filename = filename[0:filename.find('.')] + ".zip"
else:
filename = filename + ".zip"
z = zipfile.ZipFile(filename, 'w')
if os.path.isdir(filepath):
# If it is a subfolder, compress everything in filename.zip
for d in os.listdir(filepath):
z.write(filepath + os.sep + d, d)
else:
# It it is a single file
z.write(filepath, true_name)
z.close()
header_dic = {
'filename': filename,
'file_size': z.infolist()[0].file_size
}
header_json = json.dumps(header_dic)
header_bytes = header_json.encode('utf-8')
conn.send(struct.pack('i', len(header_bytes)))
# sender header
conn.send(header_bytes)
total_size = z.infolist()[0].file_size
# sender data
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