Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 9, 2009 14:34:20

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Докачка на ftp с помощью ftplib

Всем привет! Столкнулся с проблемой, когда нужно реализовать докачку файла на ftp.Сделал следующим макаром (предполагается, что часть файла уже на ftp):

from ftplib import FTP

sendFile = open ("path/to/file", 'rb')
ftpConnect = FTP ("ftpServer")
ftpConnect.login ("login", "password")
ftpConnect.storbinary ('APPE ' + "file", sendFile, 128)
ftpConnect.quit ()
ftpConnect.close ()
Вроде, все проходит гладко, но размер закачанного файла больше от исходного на столько, сколько весила загруженная часть файла. Пробовал заливать с помощью FileZilla - все ок. Сервер на proftpd, опции AllowStoreRestart и AllowOverwrite включил. Может кто знает, в чем проблема?



Отредактировано (Янв. 19, 2009 16:22:27)

Офлайн

#2 Янв. 11, 2009 03:35:09

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Докачка на ftp с помощью ftplib

Я с ftplib не работал, но попробовал бы сделать sendFile.seek(размер_закачаной_части).
Или, если не получится, обернул бы sendFile так, чтобы первый байт был первый незакачаным байтом.
Но мне почему то кажется, что есть более элегантное решение описанное в документпции.



Офлайн

#3 Янв. 19, 2009 16:21:58

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Докачка на ftp с помощью ftplib

Спасибо за подсказку. Проблему решил следующим макаром:

import os
from ftplib import FTP

fileUploadName = "file"
sendFile = open ("path/to/file", 'rb')
ftpConnect = FTP ("ftpServer")
ftpConnect.login ("login", "password")
try:
ftpConnect.voidcmd('TYPE I')
uploadFileSize = ftpConnect.size (fileUploadName)
except:
uploadFileSize = 0
if (uploadFileSize == 0):
ftpConnect.storbinary ('STOR ' + fileUploadName, sendFile, 128)
else:
sendFile.seek (uploadFileSize, os.SEEK_SET)
ftpConnect.storbinary ('APPE ' + fileUploadName, sendFile, 128)
ftpConnect.quit ()
ftpConnect.close ()



Отредактировано (Янв. 19, 2009 16:23:06)

Офлайн

#4 Янв. 20, 2009 09:25:03

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Докачка на ftp с помощью ftplib

well
except:
Перехватывай все эксцепшены только тогда, когда точно понимаешь, что тебе нужны все эксцепшены. В моей практике я сталкивался с таким раза три или четыре… Зато с перехватом не того, что надо из-за лени программиста который это написал, я сталкивался столько раз, что и не пересчитать!



Офлайн

#5 Янв. 20, 2009 09:44:45

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Докачка на ftp с помощью ftplib

Пробовал таким макаром:

fileList = ftpConnect.nlst()
if [fileUploadName in fileList]:
...
но, если на сервере ничего нету (пустой корень), то команда nlst просто подвисает. А за замечание большое спасибо.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version