python基于FTP实现文件传输相关功能代码实例


Posted in Python onSeptember 28, 2019

这篇文章主要介绍了python基于FTP实现文件传输相关功能代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

本实例有文件传输相关功能,包括:文件校验、进度条打印、断点续传

客户端示例:

import socket
import json
import os
import hashlib

CODE = {
  '1001':'重新上传文件'
}

def file_md5(file_path):
  obj = open(file_path,'rb')
  m = hashlib.md5()
  for line in obj:
    m.update(line)
  obj.close()
  return m.hexdigest()

def jdt(size,total_size):
  '''
  显示进度条
  '''
  val = int(size/total_size * 100)
  print('\r%s%%|%s' %(val,'#'*val,),end='')

def send_file(exist_size,file_total_size):
  '''
  发送文件
  :param exist_size: 开始读取字节的位置
  :param file_total_size: 文件大小
  :return:
  '''
  f = open(file_path, 'rb')
  f.seek(exist_size)
  send_size = exist_size
  while send_size < file_total_size:
    data = f.read(1024)
    sk.sendall(data)
    send_size += len(data)
    jdt(send_size,file_total_size)
  f.close()
  print('上传成功')

def upload(file_path):
  '''文件上传(含断点)'''
  file_path = '111.jpg'
  file_md5_val = file_md5(file_path)
  file_name = os.path.basename(file_path)
  file_size = os.stat(file_path).st_size

  cmd_dict = {'cmd': 'upload', 'file_name': file_name, 'size': file_size, 'md5': file_md5_val}
  upload_cmd_bytes = json.dumps(cmd_dict).encode('utf8')
  sk.sendall(upload_cmd_bytes)

  # 2.等待服务端相应
  response = json.loads(sk.recv(8096).decode('utf8'))
  if response['code'] == 1001:
    send_file(0,file_size)
  else: # 断点续传
    exist_size = response('size')
    send_file(exist_size,file_size)

sk = socket.socket()
sk.connect(('127.0.0.1',8001))

while 1:
  #upload|文件路径
  user_input = input('命令>>>')
  # 1、自定义协议{'cmd':'upload','file_name':'...'}
  cmd,file_path = user_input.split('|',maxsplit=1)
  if cmd == 'upload':
    upload(file_path)
  elif cmd == 'download':
    pass

服务端示例:

import socketserver
import json
import os
import shutil

CODE = {
  '1001':'重新上传文件'
}

def upload(cmd_dict,conn,username):
  '''服务端完成上传文件(含断点续传)'''
  # 2.获取文件信息
  file_md5 = cmd_dict['md5']
  file_name = cmd_dict['file_name']
  file_md5_path = os.path.join('home', username, file_md5)
  file_name_path = os.path.join('home', username, file_name)
  upload_file_size = cmd_dict['size']

  # 3.判断文件是否存在
  exist = os.path.exists(file_md5_path)
  if not exist: # 不续传
    # 3.1.1通知可以开始上传,已经准备好
    response = {'code': 1001}
    conn.sendall(json.dumps(response).encode('utf8'))

    # 3.1.2接收上传的文件内容
    f = open(file_md5_path, 'wb')
    recv_size = 0
    while recv_size < upload_file_size:
      data = conn.recv(1024)
      f.write(data) # 写到内存
      f.flush() # 刷到硬盘
      recv_size += len(data)
    f.close()

    # 3.1.3改文件名
    shutil.move(file_md5_path, file_name_path)

  else: # 存在就续传
    # 3.2续传 + 大小
    exist_size = os.stat(file_md5_path).st_size
    response = {'code': 1002, 'size': exist_size}
    conn.sendall(json.dumps(response).encode('utf8'))

    f = open(file_md5_path, 'ab')
    recv_size = exist_size
    while recv_size < upload_file_size:
      data = conn.recv(1024)
      f.write(data) # 写到内存
      f.flush() # 刷到硬盘
      recv_size += len(data)
    f.close()

    # 3.1.3改文件名
    shutil.move(file_md5_path, file_name_path)


class NBServer(socketserver.BaseRequestHandler):
  def handle(self):
    '''self.request是请求客户端的socket对象'''

    #1.接受命令
    upload_cmd_bytes = self.request.recv(8096)
    cmd_dict = json.loads(upload_cmd_bytes.decode('utf8'))

    if cmd_dict['cmd'] == 'upload':
      upload(cmd_dict,self.request,'zhangzijian')
    elif cmd_dict['cmd'] == 'download':
      pass

if __name__ == '__main__':
  server = socketserver.ThreadingTCPServer(('127.0.0.1',8001),NBServer)
  server.serve_forever()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
利用soaplib搭建webservice详细步骤和实例代码
Nov 20 Python
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
python实现清屏的方法
Apr 30 Python
九步学会Python装饰器
May 09 Python
python提取字典key列表的方法
Jul 11 Python
Python探索之修改Python搜索路径
Oct 25 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
python 执行shell命令并将结果保存的实例
May 11 Python
Python文件常见操作实例分析【读写、遍历】
Dec 10 Python
基于Python新建用户并产生随机密码过程解析
Oct 08 Python
超实用的 30 段 Python 案例
Oct 10 Python
Python中sys模块功能与用法实例详解
Feb 26 Python
python网络爬虫 Scrapy中selenium用法详解
Sep 28 #Python
在vscode中配置python环境过程解析
Sep 28 #Python
python爬虫 线程池创建并获取文件代码实例
Sep 28 #Python
python 单线程和异步协程工作方式解析
Sep 28 #Python
python爬虫 正则表达式解析
Sep 28 #Python
python爬虫 Pyppeteer使用方法解析
Sep 28 #Python
python安装scipy的步骤解析
Sep 28 #Python
You might like
global.php
2006/12/09 PHP
PHP 全角转半角实现代码
2010/05/16 PHP
Look And Say 序列php实现代码
2011/05/22 PHP
关于js和php对url编码的处理方法
2014/03/04 PHP
PHP中IP地址与整型数字互相转换详解
2014/08/20 PHP
PHP合并discuz用户脚本的方法
2015/08/04 PHP
PHP7常量数组用法分析
2016/09/26 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
2007/03/27 Javascript
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
JavaScript高级程序设计 扩展--关于动态原型
2010/11/09 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
SVG动画vivus.js库使用小结(实例代码)
2017/09/14 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
Python tkinter label 更新方法
2018/10/11 Python
详解Python数据分析--Pandas知识点
2019/03/23 Python
python实现坦克大战
2020/04/24 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
大学生村官工作感言
2014/01/10 职场文书
学生打架检讨书大全
2014/01/23 职场文书
玲玲的画教学反思
2014/02/04 职场文书
不拖欠农民工工资承诺书
2014/03/31 职场文书
家长通知书教师评语
2014/04/17 职场文书
财务负责人岗位职责
2015/02/03 职场文书
清洁工岗位职责
2015/02/13 职场文书
慰问信格式
2015/02/14 职场文书