2016-02-09 3 views
0

я использую следующее размораживание для загрузки файлов, процесс, чтобы проверить, если каталог существует, или нет, если не он должен создать его затем загрузить файл,питон метод FTP - Ошибка 553 Не удалось создать файл

я продолжать получать эту ошибку, тем временем, если я соединиться с тем же пользователем и ПАРОЛЬ к FTP я могу создавать каталоги, я использую vsftp как сервер

def uploadFTP(filepath, filename_new, env): 

    global config 

    ftpsrv = config[env]["ftpsrv"] 
    ftpusr = config[env]["ftpuser"] 
    ftppwd = config[env]["ftppass"] 

    filename = os.path.basename(filename_new) 
    today = datetime.datetime.now() 
    today_path = today.strftime("%Y/%m/%d") 
    filename=os.path.join(today_path, filename) 
    if not os.path.exists(os.path.join(os.path.dirname(filepath), today_path)): 
       os.makedirs(os.path.join(os.path.dirname(filepath), today_path)) 
    try: 
     ftp = ftplib.FTP(ftpsrv) 
     ftp.login(ftpusr, ftppwd) 
    except: 
    logger.error("Ftp connection error has occurred") 
     raise 
    else: 
     f = open(filepath, "r") 
     cmd = "STOR %s" %(filename) 
     out = ftp.storbinary(cmd, f) 
     f.close() 
     ftp.quit() 
     return out 

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

File "/usr/lib64/python2.6/ftplib.py", line 218, in getresp 
    raise error_perm, resp 
error_perm: 553 Could not create file. 

Любой ADV здесь?

Update:

изменил функцию следующим образом

def uploadFTP(filepath, filename_new, env): 

    global config 

    ftpsrv = config[env]["ftpsrv"] 
    ftpusr = config[env]["ftpuser"] 
    ftppwd = config[env]["ftppass"] 

    filename = os.path.basename(filename_new) 
    today = datetime.datetime.now() 
    today_path = today.strftime("%Y/%m/%d") 
    filename=os.path.join(today_path, filename) 
    if not os.path.exists(os.path.join(os.path.dirname(filepath), today_path)): 
       os.makedirs(os.path.join(os.path.dirname(filepath), today_path)) 
    try: 
     ftp = ftplib.FTP(ftpsrv) 
     ftp.login(ftpusr, ftppwd) 
    except: 
     logger.error("Ftp connection error has occurred") 
     raise 
    else: 
     f = open(filepath, "r") 
     ftp.mkd(today_path) 
     cmd = "STOR %s" %(filename) 
     out = ftp.storbinary(cmd, f) 
     f.close() 
     ftp.quit() 
     return out 

и я получаю

ftp.mkd(today_path) 
    File "/usr/lib64/python2.6/ftplib.py", line 556, in mkd 
    resp = self.sendcmd('MKD ' + dirname) 
    File "/usr/lib64/python2.6/ftplib.py", line 243, in sendcmd 
    return self.getresp() 
    File "/usr/lib64/python2.6/ftplib.py", line 218, in getresp 
    raise error_perm, resp 
error_perm: 550 Create directory operation failed 

Примечание: разрешение в папку FTP является 777 и владелец имеет полный доступ на чтение и запись, если я подключаюсь через ftp, я могу создавать папки, но через эту функцию i cant

посоветуйте пожалуйста

ответ

0

Вы передаете ручку в папку:

f = open(filepath, "r") 

вместо ручки к файлу:

f = open(filepath + filename_new, "r") 

UPDATE:

Ваша переменная today_path имеет косую черту и это предполагает, что вы хотите создавать вспомогательные папки. Вы не можете сделать это непосредственно с помощью ftp.mkd, однако, вы могли бы использовать этот solution из lecnt:

cdTree (today_path)

Используя этот метод из lecnt:

def cdTree(currentDir): 
    if currentDir != "": 
     try: 
      ftp.cwd(currentDir) 
     except IOError: 
      cdTree("/".join(currentDir.split("/")[:-1])) 
      ftp.mkd(currentDir) 
      ftp.cwd(currentDir) 
+0

его возвращение ошибки IOError: [ Errno 2] Нет такого файла или каталога:, он должен создать папку в удаленном месте, а затем поместить туда файл .. его не делать – Jecki

+0

Вам нужно сначала вызвать 'ftp.mkd (путь к файлу)', если каталог не существует – Jaco

+0

Ваш 'сегодняшний_path' содержит косые черты, вы хотите создать подпапки? – Jaco

Смежные вопросы