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()

目录结构如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值