Обнаружилась проблема в следующей задаче: загрузка файлов размером более 1Гб на ftp находясь за squid прокси. Файлы меньшего размера загружаются без проблем. Сразу скажу, что явно заданных ограничений ни на размер файла, ни на время сессии ни на стороне ftp, ни на стороне прокси нет. Это подтверждается тем, что при использовании ftp-клиента (например, того, который есть в TotalCommander), загрузка проходит успешно. Загружались файлы размером от 1 до 5 Гб.
Вот python-скрипт (за основу взят скрипт из примеров работы pycurl):
# -*- coding: utf-8 -*- import os, sys import pycurl ftp_user_name = "*****" ftp_user_password = "*****" proxy = "*****" proxy_port = ***** proxy_user_name = "*****" proxy_user_password = "*****" ftp_destination = "ftp://*****/test.zip" source_file = "test.zip" class FileReader: def __init__(self, fp): self.fp = fp def read_callback(self, size): return self.fp.read(size) if not os.path.exists(source_file): print("Error: the file '%s' does not exist" % source_file) raise SystemExit c = pycurl.Curl() c.setopt(pycurl.URL, ftp_destination) c.setopt(pycurl.UPLOAD, 1) c.setopt(pycurl.USERPWD, "%s:%s" % (ftp_user_name, ftp_user_password)) c.setopt(pycurl.PROXY, proxy) c.setopt(pycurl.PROXYPORT, proxy_port) c.setopt(pycurl.PROXYUSERPWD, "%s:%s" % (proxy_user_name, proxy_user_password)) c.setopt(pycurl.VERBOSE, 1) c.setopt(pycurl.HTTPPROXYTUNNEL, 1) c.setopt(pycurl.READFUNCTION, FileReader(open(source_file, 'rb')).read_callback) filesize = os.path.getsize(source_file) c.setopt(pycurl.INFILESIZE, filesize) print('Uploading file %s to url %s' % (source_file, ftp_destination)) c.perform() c.close()
* Send failure: Connection was aborted * Closing connection 0 Traceback (most recent call last): File ".\file_upload.py", line 39, in <module> c.perform() pycurl.error: (55, 'Send failure: Connection was aborted')