Мы завершаем проверкой, отличается ли результирующее имя от оригинального. Если они совпадают, значит оригинальное имя не соответствовало нашему образцу, и мы просто добавляем .1 к имени. Наконец, мы восстанавливаем полное имя файла, добавляя расширение, и вызывая функцию
def nextfile(filename):
(path,base) = os.path.split(filename)
(name,ext) = os.path.splitext(base)
new = re.sub(r'\.(\d+)$',
lambda m:'.'+ str(1+int(m.group(1))),
name)
if new == name :
new = name + '.1'
return os.path.join(path,new+ext)
Теперь мы полностью готовы заняться реальной работой загрузки файла на FTP-сервер. Сначала мы удостоверимся, что наше окружение имеет переменную
if __name__ == "__main__":
sethome()
host = getftphost()
Далее, мы извлекаем данные учётной записи пользователя для выбранного хоста из файла .netrc, если он присутствует (выделено). Это может закончиться неудачей по различным причинам (могло не быть .netrc-файла, или данные хоста отсутствуют в файле); в этом случае будет возбуждено исключение. Если это случится, мы сообщаем об этом пользователю и требуем имя пользователя и пароль с помощью всплывающего окна:
try:
(user,acct,password) = \
netrc.netrc().authenticators(host)
except:
acct=None
user = Draw.PupStrInput(
'No .netrc file found, enter username:',
"",75)
password = Draw.PupStrInput('Enter password:',"",75)
Отрендеренное изображение было сохранено как объект Блендера
Следующим шагом нужно подключиться к FTP-серверу, используя имя хоста и данные учётной записи, которые мы извлекли раньше (выделено). Как только связь будет установлена, мы извлекаем список имён файлов с помощью метода
im = Image.Get('Render Result')
filename = imagefilename(im)
ftp = FTP(host,user,password,acct)
files = ftp.nlst()
Поскольку мы хотим убедиться, что мы не перезаписываем никаких файлов на FTP-сервере, мы удаляем путь из имени файла нашего загруженного изображения с помощью функции
dstfilename = os.path.basename(filename)
while dstfilename in files:
dstfilename = nextfile(dstfilename)