# -*- 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