程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python 文件上傳之---斷點續傳

編輯:Python

server.py文件內容如下

import socket
import os
import json
import hashlib
sk = socket.socket()
sk.bind(('127.0.0.1', 8000))
sk.listen(5)
conn, addr = sk.accept()
while True:
# 接受客戶端發送的數據,看是否存在存在md5文件名稱
recive_msg = json.loads(conn.recv(1024).decode('utf8'))
# md5文件名
md5_file_name = recive_msg['file_md5_value']
# 文件大小
file_total_size = recive_msg['file_total_size']
# 原始文件大小
origin_file_name = recive_msg['origin_file_name']
# 判斷文件是否存在,存在的話續傳.否則從0開始傳
is_exists = os.path.exists('./upload/' + md5_file_name)
if not is_exists:
# 從0開始上傳
conn.sendall(json.dumps({'code': 1001, 'msg': '從0開始上傳'}).encode('utf8'))
# 接受從客戶端傳來的數據
recive_size = 0
f = open('./upload/' + md5_file_name, 'wb')
while recive_size < file_total_size:
data = conn.recv(1024)
f.write(data)
# 主動將內存中的數據刷到到文件中去
f.flush()
recive_size += len(data)
f.close()
# 上傳完畢後,修改文件的文件名為原始文件名
if os.path.getsize('./upload/' + md5_file_name) == file_total_size:
os.rename('./upload/' + md5_file_name, './upload/' + origin_file_name)
else:
# 斷點續傳, (先把已經接收到的文件的大小發送給客戶端)
# 已接收到的大小
has_recive_size = os.path.getsize('./upload/' + md5_file_name)
conn.sendall(json.dumps({'code': 1002, 'msg': '斷點續傳', 'has_recive_size': has_recive_size}).encode('utf8'))
recive_size = has_recive_size
f = open('./upload/' + md5_file_name, 'ab')
while recive_size < file_total_size:
data = conn.recv(1024)
f.write(data)
# 主動將內存中的數據刷到到文件中去
f.flush()
recive_size += len(data)
f.close()
# 上傳完畢後,修改文件的文件名為原始文件名
if os.path.getsize('./upload/' + md5_file_name) == file_total_size:
os.rename('./upload/' + md5_file_name, './upload/' + origin_file_name)
break
conn.close()
sk.close()

client.py文件內容如下:

import socket
import os
import hashlib
import json
sk = socket.socket()
sk.connect(('127.0.0.1', 8000))
md5 = hashlib.md5()
# 上傳文件前先檢查文件的md5值,如果服務端存在就續傳,否則從0開始上傳
# 臨時文件的名稱是md5值,上傳成功後修改文件名稱為真實文件名稱
while True:
file_name = input('請輸入需要上傳的文件的名稱:').strip()
# 獲取文件的md5值
with open(file_name, 'rb') as f:
for line in f:
md5.update(line)
md5_value = md5.hexdigest()
# 獲取文件的總大小
total_size = os.path.getsize(file_name)
# 組合發送的數據
dic = {'file_md5_value': md5_value, 'file_total_size': total_size, 'origin_file_name': file_name}
dic_str_bytes = json.dumps(dic).encode('utf8')
# 發送數據
sk.sendall(dic_str_bytes)
# 判斷code值,是否從0開始上傳
has_code_msg = json.loads(sk.recv(1024).decode('utf8'))
code = has_code_msg['code']
if code == 1001:
# 從0開始上傳
try:
f = open(file_name, 'rb')
upload_size = 0
while upload_size < total_size:
data = f.read(1024)
sk.sendall(data)
upload_size += len(data)
# break # 測試斷點
finally:
f.close()
else:
# 斷點續傳
# 先獲取已經上傳過的大小
has_send_size = has_code_msg['has_recive_size']
try:
f = open(file_name, 'rb')
upload_size = has_send_size
f.seek(has_send_size)
while upload_size < total_size:
data = f.read(1024)
sk.sendall(data)
upload_size += len(data)
finally:
f.close()

目錄結構如下:


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved