一、程序说明

1、文件上传目标路径:home/file

2、目标文件:putfile.png

3、服务端代码:put_server.py

4、客户端代码:put_client.py

二、各部分代码

1、服务端代码:put_server.py

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
实现文件断点续传的服务器端
""" import socket
import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) home = os.path.join(BASE_DIR, "home/file")
sk = socket.socket()
sk.bind(('127.0.0.1', 8001))
sk.listen(5) while True:
print("Waiting....")
conn, addr = sk.accept()
conn.sendall(bytes('欢迎登录', encoding='utf-8'))
flag = True
while flag:
client_bytes = conn.recv(1024) #接收客户端发送过来的内容
client_str = str(client_bytes, encoding='utf-8') #将内容转换成字符串 # 将客户端发送过来的内容以"|"拆分为:命名方法,文件名,文件大小,目标路径
func, file_name, file_byte_size, targe_path = client_str.split('|', 3)
file_byte_size = int(file_byte_size)
path = os.path.join(home, file_name)
has_received = 0 #首先判断该路径下是否已存在文件
if os.path.exists(path):
conn.sendall(bytes("", encoding='utf-8')) #发送通知客户端,该文件已存在
is_continue = str(conn.recv(1024), encoding='utf-8') #等待客户端选择回复
if is_continue == "":
has_file_size = os.stat(path).st_size
conn.sendall(bytes(str(has_file_size), encoding='utf-8')) #将已接收的文件大小给客户端
has_received += has_file_size
f = open(path, 'ab')
else:
f = open(path, 'wb')
else:
conn.sendall(bytes("", encoding='utf-8'))
f = open(path, 'wb') while has_received < file_byte_size:
try:
data = conn.recv(1024)
if not data:
raise Exception
except Exception:
flag = False
break
f.write(data)
has_received += len(data)
print("文件已接收完成!")
f.close()

2、客户端代码:put_client.py

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
实现文件断点续传的客户端
""" import socket
import sys
import re
import os
FILE_DIR = os.path.dirname(__file__) ck = socket.socket()
ck.connect(('127.0.0.1', 8001))
print(str(ck.recv(1024), encoding='utf-8')) #定义一个函数,计算进度条
def bar(num = 1, sum = 100):
rate = float(num) / float(sum)
rate_num = int(rate * 100)
temp = '\r%d %%' % (rate_num)
sys.stdout.write(temp) while True:
inp = input('请输入(内容格式:post|文件路径 目标路径): \n >>> ').strip() #输入内容格式:命令|文件路径 目标路径
func, file_path =inp.split("|", 1) #将输入的内容拆分为两部分,方法名和路径
local_path, target_path = re.split("\s*", file_path, 1) #再将路径部分,通过正则表达式。以空格拆分为:文件路径和上传的目标路径
file_byte_size = os.stat(local_path).st_size #获取文件的大小
file_name = os.path.basename(local_path) #设置文件名 post_info = "post|%s|%s|%s" % (file_name, file_byte_size, target_path) #将发送的内容进行拼接
ck.sendall(bytes(post_info, encoding='utf-8')) #向服务器端发送内容 result_exist = str(ck.recv(1024), encoding='utf-8')
has_sent = 0
if result_exist == "":
inp = input("文件已存在,是否续传?Y/N:").strip()
if inp.upper() == 'Y':
ck.sendall(bytes("", encoding='utf-8'))
result_continue_pos = str(ck.recv(1024), encoding='utf-8') #已经传输了多少的文件内容
print(result_continue_pos)
has_sent = int(result_continue_pos) else:
ck.sendall(bytes("", encoding='utf-8')) #发送2005代表不续传 file_obj = open(local_path, 'rb') #对文件进行读操作
file_obj.seek(has_sent) #调整指针 while has_sent < file_byte_size:
data = file_obj.read(1024)
ck.sendall(data)
has_sent += len(data)
bar(has_sent, file_byte_size) #进度条 file_obj.close()
print("文件上传成功!")

python--简单的文件断点续传实例的更多相关文章

  1. Python读写Excel文件的实例

    最近由于经常要用到Excel,需要根据Excel表格中的内容对一些apk进行处理,手动处理很麻烦,于是决定写脚本来处理.首先贴出网上找来的读写Excel的脚本. 1.读取Excel(需要安装xlrd) ...

  2. python 简单实现文件拷贝

    1.背景 一日加班需要写一个文件拷贝的函数. 写了几版拷贝函数,有需要的直接粘贴过去 def CopyLocaleFile1(sorfile,desfile): #第一版 sorfp=open(sor ...

  3. Python 简单的文件上传功能

    简单地在程序当前目录下上传一张图片: 1.png 到程序的 yuan 文件夹下.这里使用的是固定参数 post,如果后期有需求,可以增加判断来更加完善程序. # server 端 import soc ...

  4. C#中简单的文件操作实例

    using System; using System.IO; namespace Demo { class Program { static string tmpPath = @"D:/Lg ...

  5. Python 简单批量请求接口实例

    #coding:utf-8 ''' Created on 2017年11月10日 @author: li.liu ''' import urllib import time str1=''' http ...

  6. 【python-ini】python读写ini文件

    [python-ini]python读写ini文件 本文实例讲述了Python读写ini文件的方法.分享给大家供大家参考.具体如下: 比如有一个文件update.ini,里面有这些内容:   1 2 ...

  7. python操作xml文件

    一.什么是xml? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. abc.xml <?xml version="1.0&q ...

  8. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  9. Python绘制PDF文件~超简单的小程序

    Python绘制PDF文件 项目简介 这次项目很简单,本次项目课,代码不超过40行,主要是使用 urllib和reportlab模块,来生成一个pdf文件. reportlab官方文档 http:// ...

随机推荐

  1. Mysql 学习参考

    [1]Mysql 基础知识 (1)<Mysql 官网> (2)<菜鸟教程之Mysql数据库教程> (3)<C语言中文网之Mysql数据库栏> (4)<W3Sc ...

  2. Sitecore客户体验成熟度模型之旅

    “成熟”这个词带来了很多想法:你在青年时不愿意找到工作?你四岁的孩子偶尔发脾气?可能还有你的公司能否在数字化时代提供个性化的客户体验? 你如何定义CX成熟度?如果您的CX战略仍处于开发阶段,您需要达到 ...

  3. [SOJ #721]第三送分题(2019-11-14考试)/[CF675E]Trains and Statistic

    题目大意 在一条直线上有\(n\)个点.在第\(i\)个点可以花费\(1\)的代价到达\((i,a_i]\)中任意一点,用\(S[i][j]\)表示从点\(i\)到点\(j\)的最少花费,求\(\su ...

  4. Java学习:线程间通信

    线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同重点:有效的利用资源 分析:需要那些类 1 资源类:包子类 设置包子的属性 包子的状态:有true 没有false 2 ...

  5. java基本数据类型的变量

    一.整型变量 短整型(short).整型(int)和长整型(long),它们都可以定义整型变量,但是由于分配的内存空间不同,所能表示的数据的长度也不同. 我们可以定义并初始化一个整型变量: int a ...

  6. java属性和普通方法

    属性和普通方法 一.定义类 上一节讲了很多深奥的理论,那么这节我们就得实践一下,先简单描述一下我们的实体世界:有一个学生小明,那么这个学生就是一个对象,这个对象有哪些属性和方法呢,我们可以先简单抽象一 ...

  7. 使用ASP.NET Core MVC应用程序中的ResponseCache属性处理缓存(转载)

    HTTP响应的缓存意味着当发出HTTP请求时,服务器生成的响应由浏览器或服务器存储在某个地方,以便在对同一资源的连续HTTP请求中重复使用.实质上,我们正在存储生成的响应,并将该响应重用于后续请求一段 ...

  8. win7系统 右击任务栏 资源管理器 弹出菜单“已固定”和“最近”项目不显示故障处理

    故障描述:右击任务栏中资源管理器图标时,弹出菜单只有“资源管理器”和“解除锁定”两个项目,“已固定”和“最近”项目缺失不显示,其他程序均显示正常,只有资源管理器这样.此故障一般发生在经常使用“已固定” ...

  9. vuex简单化理解和安装使用

     1.简单化理解 首先你要明白 vuex 的目的 就是为了 集中化的管理项目中 组件所有的 数据状态 (state) 0. 第一步你要明白 , store 的重要性 , store 类似一个中央基站, ...

  10. 为什么MES系统要定制化?看这三家汽车供应商的苦恼

    很多企业对于为什么要对MES系统进行选择和定制化很不理解,今天,小编通过一个故事给大家进行阐述—— 故事背景: 汽车电子行业的三家企业A,B,C. A是整车厂一级供应商,主要产品为汽车电子配电盒. B ...