# -*- coding: utf-8 -*-

# 本地bytes 数据上报服务器同时创建文件
from ftplib import FTP

import time, _io

from constant import ftp_host, ftp_port, ftp_pw, ftp_user, ftp_to_path
from log_cf import logger

def ftp_connect():
  ftp = FTP()
  # ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
  ftp.connect(ftp_host, ftp_port) # 连接
  ftp.login(ftp_user, ftp_pw) # 登录,如果匿名登录则用空串代替即可
  # ftp.login("", "") # 登录,如果匿名登录则用空串代替即可
  ftp.cwd(ftp_to_path) # 改变ftp的操作目录
  return ftp

ftp_obj = ftp_connect()  # 只有一个连接, 而不是发送一个文件进行一次连接

def send2ftp_server(content): # 默认上传最大数据8192, 分块上传

  # content: bytes

  fp = _io.BufferedReader(_io.BytesIO(content))  # 创建fp 对象, 用于ftp 创建文件
  filename = str(time.time())  # 时间戳做文件名, 自动排序
  tmp_filename = filename + 'tmp'  # 传输为完成的文件
  global ftp_obj  # 使用全局变量, 不多创建连接
  try:
    ftp_obj.storbinary('STOR ' + tmp_filename, fp) # 上传文件
  except Exception as e: # BrokenPipeError  10分钟不用会断开
    print(type(e), e)
    ftp_obj = ftp_connect()
  try:
    ftp_obj.storbinary('STOR ' + tmp_filename, fp) 
  except Exception as e:
    logger.warning("信息上报FTP失败: {}: {}".format(type(e), e))
    return False
  ftp_obj.rename(tmp_filename, filename)
  return True

def close_ftp():  # 不调用, 不主动断开
  try:
    ftp_obj.quit()
  except Exception as e:
    logger.warning("用ftp.quit()断开链接失败: " + str(e))
    ftp_obj.close() # 服务开启, 连上不断

if __name__ == '__main__':
  pass

最新文章

  1. artTemplate模板引擎学习实战
  2. 使用js实现点击按钮下载文件
  3. Spring的核心机制——依赖注入(Dependency Inject)
  4. 【技术贴】关闭CMD错误提示声音
  5. WPF开发技术介绍
  6. using 1.7 requires using android build tools version 19 or later
  7. java 语法 java没学好,休想学好安卓!
  8. Python强大的自省简析
  9. Java解析JSON文件的方法 (二)
  10. css3布局属性flex
  11. 【BZOJ4407】于神之怒加强版(莫比乌斯反演)
  12. python 备份压缩传输
  13. iOS-----------设置自定义字体
  14. spring data jpa 查询自定义字段,转换为自定义实体
  15. ASP.net MVC模式介绍(一)
  16. RocketMq(二)消息中间件源码下载、模块分化以及集群模式的认知
  17. Coursera台大机器学习技法课程笔记14-Radial Basis Function Network
  18. WDA-FPM-3-SEARCH(OIF)
  19. Bootstrap-CL:略缩图
  20. ubuntu16.04安装最新版本的wine

热门文章

  1. python爬百度文库课件
  2. springboot学习二:配置文件配置
  3. Oracle不常用SQL
  4. 使用Autoencoder进行降维
  5. Crontab 执行时没有环境变量!
  6. 14Linux_BIND-Linux就该这么学
  7. Django 请求类型
  8. @PostConstruct注解小结
  9. 【Debug】逻辑分析仪数据错乱,看波形为信号耦合导致数据错乱,实际上为逻辑分析仪地线没接上!
  10. Cannot forward to error page for request ......