2010년 7월 15일 목요일

Python - SFTP, FTP 파일 업로드

# -*- coding:utf-8 -*-

import ftplib
import paramiko
from socket import *

class LibFTP:
    def __init__(self, ftp_host, ftp_port, ftp_mode=''):
        if ftp_mode == 'ssl':
            self._ftp = LibFTPSSL(ftp_host, ftp_port)
        else:
            self._ftp = LibFTPNormal(ftp_host, ftp_port)

    def login(self, ftp_user, ftp_pass):
        self._ftp.login(ftp_user, ftp_pass)

    def setUploadPath(self, set_upload_path):
        self._ftp.setUploadPath(set_upload_path)

    def upload(self, upload_file_path, upload_file_name):
        self._ftp.upload(upload_file_path, upload_file_name)

    def close(self):
        self._ftp.close()


class LibFTPSSL:
    def __init__(self, ftp_host, ftp_port):
        try:
            ftp_host = gethostbyname(ftp_host)
            self._connect = paramiko.Transport((ftp_host,ftp_port))
        except Exception, e:
            raise SystemExit('SFTP connect error : '+ftp_host)

    def login(self, ftp_user, ftp_pass):
        try:
            self._connect.connect(username=ftp_user,password=ftp_pass)
            self._sftp = paramiko.SFTPClient.from_transport(self._connect)
        except Exception, e:
            raise SystemExit('SFTP login error')

    def setUploadPath(self, set_upload_path):
        self._sftp.chdir(set_upload_path)

    def upload(self, upload_file_path, upload_file_name):
        try:
            wf = self._sftp.open(upload_file_name, 'wb')
            rf = open(upload_file_path, 'rb')
            data = rf.read(1024*1024)
            while(data):
                wf.write(data)
                data = rf.read(1024*1024)
        except Exception, e:
            raise SystemExit('SFTP upload error')

    def close(self):
        self._connect.close()

class LibFTPNormal:
    def __init__(self, ftp_host, ftp_port):
        try:
            self._connect = ftplib.FTP(ftp_host)
        except Exception, e:
            raise SystemExit('FTP connect error : '+ftp_host)

    def login(self, ftp_user, ftp_pass):
        try:
            self._connect.login(ftp_user, ftp_pass)
        except Exception, e:
            raise SystemExit('FTP login error')

    def setUploadPath(self, set_upload_path):
        self._connect.cwd(set_upload_path)

    def upload(self, upload_file_path, upload_file_name):
        try:
            self._connect.storbinary('STOR '+upload_file_name, open(upload_file_path, 'rb'))
        except Exception, e:
            raise SystemExit('FTP upload error')

    def close(self):
        self._connect.close()

0 개의 댓글:

댓글 쓰기