pycurl+ftp上传数据,但上传上去的大小总为0
各位大侠好。下述代码基于 pycurl + ftp协议 向ftp服务器上传数据,但总是出现下述问题:
Uploaded unaligned file size (0 out of 10261268 bytes) 即可以上传上去,但大小都是 0 ;
请问各位大侠,如何解决,谢谢!
下述为代码
import time
import os
import ftplib
import ssl
import socket
import pycurl, StringIO
from os.path import getsize
import ftplib
from ftplib import FTP
from ftps import FTPS
import pytest
from mock import patch
from six.moves import range
from six import BytesIO
import logging
LOGGER = logging.getLogger('ftps')
class FTPS11(object):
def __init__(self, url, connect_timeout=5, max_retries=5):
assert url.startswith('ftps://'), 'Expected URL scheme is ftps'
self.base_url = url
self.connect_timeout = connect_timeout
self.max_retries = max_retries
self.client = pycurl.Curl()
self.reset()
def reset(self):
self.client.reset()
#self.client.setopt(pycurl.USE_SSL, USESSL_ALL)
self.client.setopt(pycurl.SSL_VERIFYPEER, False)
self.client.setopt(pycurl.SSL_VERIFYHOST, False)
self.client.setopt(pycurl.CONNECTTIMEOUT, self.connect_timeout)
def perform(self):
"""Perform operation with retries."""
retries = 0
while retries < self.max_retries:
try:
self.client.perform()
LOGGER.debug('Operation performed successfully')
return
except pycurl.error as exc:
LOGGER.warning(exc)
LOGGER.debug('Retrying (%d)...', retries)
retries += 1
LOGGER.error('Failed to perform operation')
def list(self, remote_dir=None):
if remote_dir is None:
# List root directory by default
remote_dir = ''
elif not remote_dir.endswith('/'):
# Make sure that directory ends with a forward slash character
remote_dir += '/'
url = '/'.join((self.base_url, remote_dir))
self.client.setopt(pycurl.URL, url)
#self.client.setopt(pycurl.USERPWD, 'ydrobot:123qweasd')
#self.client.setopt(pycurl.USERPWD, 'ftp_test:1')
output_buffer = BytesIO()
self.client.setopt(pycurl.WRITEDATA, output_buffer)
LOGGER.debug('Listing directory: %s', url)
self.perform()
self.reset()
output = output_buffer.getvalue().decode('utf-8')
files = [
line.split()[-1]
for line in output.split('\n')
if line
]
return files
def download(self, remote_filename, local_filename):
url = '/'.join((self.base_url, remote_filename))
self.client.setopt(pycurl.URL, url)
with open(local_filename, 'wb') as output_file:
self.client.setopt(pycurl.WRITEDATA, output_file)
LOGGER.debug('Downloading file: %s -> %s', url, local_filename)
self.perform()
self.reset()
def upload(self, local_filename, remote_filename):
#url = '/'.join((self.base_url, remote_filename))
url = os.path.join(self.base_url, remote_filename)
self.client.setopt(pycurl.URL, url)
print ('55555555555',self.base_url,url)
self.client.setopt(pycurl.URL, url)
#self.client.setopt(pycurl.USERPWD, 'ydrobot:123qweasd')
#self.client.setopt(pycurl.USERPWD, 'ftp_test:1')
#self.client.enterLocalPassiveMode()
self.client.setopt(pycurl.VERBOSE, 1)
with open(local_filename, 'rb') as input_file: ### with open(local_filename, 'rb') as input_file 相当于 input_file = open(local_filename, 'rb')
self.client.setopt(pycurl.UPLOAD, True)
print ('333333333333333333333333333333333333333333',os.path.getsize(local_filename),input_file,local_filename)
self.client.setopt(pycurl.READDATA, input_file)
self.client.setopt(
pycurl.INFILESIZE_LARGE,
os.path.getsize(local_filename),
)
LOGGER.debug('Uploading file: %s -> %s', local_filename, url)
self.perform()
#os.remove(local_filename)
self.reset()
return url
if __name__ == '__main__':
ftpss = FTPS11("ftps://")
address = ''
#mulmsg.equipimage = np.array(cv2.imencode('.jpg', swordImg)[1]).tostring()
timename = time.strftime("%Y%m%d%H%M%S",time.localtime())+'.jpg'
#baseaddress = filePath + '/filehandling/' + timename
baseaddress = "/home/yd/11.tar.xz"
#ftpdest = '192.168.1.35:21/2022/3/28/2064/CCD/140000/1/' + timename ### 不能写为 '192.168.1.35:21/home/ydrobot/2022/3/28/2064/CCD/140000/1/' 这样出错
ftpdest = 'ftp_test:1@192.168.1.237:21/11.tar.xz'
print ("1111111111111111111111111111111111111111111111")
address = ftpss.upload(baseaddress,ftpdest)
print ('22222222222222222222222222222222222222222222222')