python搭建FTP服務器之FTP上傳和下載

搭建ftp服務器server端

# -*- coding:utf-8 -*-
from pyftpdlib.authorizers import DummyAuthorizer
from  pyftpdlib.handlers  import FTPHandler
from  pyftpdlib.servers import FTPServer
# 實例化DummyAuthorizer來建立ftp用戶
authorizer = DummyAuthorizer()
# 參數:用戶名,密碼,目錄,權限
authorizer.add_user('admin', '123456', r'C:\Users\Administrator\Desktop\ftp', perm='elradfmwMT')
# 匿名登陸
# authorizer.add_anonymous('/home/nobody')
handler = FTPHandler
handler.authorizer = authorizer
# 參數:IP,端口,handler
server = FTPServer(('0.0.0.0', 2121), handler)           #設置爲0.0.0.0爲本機的IP地址
server.serve_forever()

函數釋義html

Python中默認安裝的ftplib模塊定義了FTP類,其中函數有限,可用來實現簡單的ftp客戶端,用於上傳或下載文件,函數列舉以下python

ftp登錄鏈接
from ftplib import FTP            #加載ftp模塊
ftp=FTP()                         #設置變量
ftp.set_debuglevel(2)             #打開調試級別2,顯示詳細信息
ftp.connect("IP","port")          #鏈接的ftp sever和端口
ftp.login("user","password")      #鏈接的用戶名,密碼
print ftp.getwelcome()            #打印出歡迎信息
ftp.cmd("xxx/xxx")                #進入遠程目錄
bufsize=1024                      #設置的緩衝區大小
filename="filename.txt"           #須要下載的文件
file_handle=open(filename,"wb").write #以寫模式在本地打開文件
ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收服務器上文件並寫入本地文件
ftp.set_debuglevel(0)             #關閉調試模式
ftp.quit()                        #退出ftp

ftp相關命令操做
ftp.cwd(pathname)                 #設置FTP當前操做的路徑
ftp.dir()                         #顯示目錄下全部目錄信息
ftp.nlst()                        #獲取目錄下的文件
ftp.mkd(pathname)                 #新建遠程目錄
ftp.pwd()                         #返回當前所在位置
ftp.rmd(dirname)                  #刪除遠程目錄
ftp.delete(filename)              #刪除遠程文件
ftp.rename(fromname, toname)#將fromname修更名稱爲toname。
ftp.storbinaly("STOR filename.txt",file_handel,bufsize)  #上傳目標文件
ftp.retrbinary("RETR filename.txt",file_handel,bufsize)  #下載FTP文件

FTP.quit()與FTP.close()的區別linux

  • FTP.quit():發送QUIT命令給服務器並關閉掉鏈接。這是一個比較「緩和」的關閉鏈接方式,可是若是服務器對QUIT命令返回錯誤時,會拋出異常。
  • FTP.close():單方面的關閉掉鏈接,不該該用在已經關閉的鏈接以後,例如不該用在FTP.quit()以後。

ftp客戶端鏈接

# -*- coding: utf-8 -*-
from ftplib import FTP
import time,tarfile,os


#鏈接ftp
def ftpconnect(host,port, username, password):
    ftp = FTP()
    # 打開調試級別2,顯示詳細信息
    # ftp.set_debuglevel(2)
    ftp.connect(host, port)
    ftp.login(username, password)
    return ftp

#從ftp下載文件
def downloadfile(ftp, remotepath, localpath):
    # 設置的緩衝區大小
    bufsize = 1024
    fp = open(localpath, 'wb')
    ftp.retrbinary('RETR ' + remotepath, fp.write, bufsize)
    ftp.set_debuglevel(0)# 參數爲0,關閉調試模式
    fp.close()

#從本地上傳文件到ftp
def uploadfile(ftp, remotepath, localpath):
    bufsize = 1024
    fp = open(localpath, 'rb')
    ftp.storbinary('STOR ' + remotepath, fp, bufsize)
    ftp.set_debuglevel(0)
    fp.close()

if __name__ == "__main__":
    #host,port, username, password
    ftp = ftpconnect("192.168.10.113", 2121,"admin", "123456")
    #下載文件,第一個是ftp服務器路徑下的文件,第二個是要下載到本地的路徑文件
    downloadfile(ftp, "/12.mp3", r"C:\Users\Administrator\Desktop\ftp\download\test.mp3")
    # 上傳文件,第一個是要上傳到ftp服務器路徑下的文件,第二個是本地要上傳的的路徑文件
    uploadfile(ftp, '/upload/1.txt', "C:/Users/Administrator/Desktop/1.txt")
    # ftp.close() #關閉ftp
    # #調用本地播放器播放下載的視頻
    # os.system('start D:\soft\kugou\KGMusic\KuGou.exe C:\Users\Administrator\Desktop\ftp\test.mp3')

    print(ftp.getwelcome())# 打印出歡迎信息
    # 獲取當前路徑
    pwd_path = ftp.pwd()
    print("FTP當前路徑:", pwd_path)
    # 顯示目錄下全部目錄信息
    # ftp.dir()
    # 設置FTP當前操做的路徑
    ftp.cwd('/upload/')
    # 返回一個文件名列表
    filename_list = ftp.nlst()
    print(filename_list)

    ftp.mkd('目錄名')# 新建遠程目錄
    ftp.rmd('目錄名')  # 刪除遠程目錄
    ftp.delete('文件名')  # 刪除遠程文件
    ftp.rename('fromname', 'toname')  # 將fromname修更名稱爲toname

    # 逐行讀取ftp文本文件
    file = '/upload/1.txt'
    # ftp.retrlines('RETR %s' % file)
    #與 retrlines()相似,只是這個指令處理二進制文件。回調函數 cb 用於處理每一塊(塊大小默認爲 8KB)下載的數據
    # ftp.retrbinary('RETR %s' % file) 

FTP對象方法說明web

  • login(user=’anonymous’,passwd=」, acct=」) 登陸 FTP 服務器,全部參數都是可選的
  • pwd() 得到當前工做目錄
  • cwd(path) 把當前工做目錄設置爲 path 所示的路徑
  • dir ([path[,…[,cb]]) 顯示 path 目錄裏的內容,可選的參數 cb 是一個回調函數,會傳遞給 retrlines()方法
  • nlst ([path[,…]) 與 dir()相似, 但返回一個文件名列表,而不是顯示這些文件名
  • retrlines(cmd [, cb]) 給定 FTP命令(如「 RETR filename」),用於下載文本文件。可選的回調函數 cb 用於處理文件的每一行
  • retrbinary(cmd,cb[,bs=8192[, ra]]) 與 retrlines()相似,只是這個指令處理二進制文件。回調函數 cb 用於處理每一塊(塊大小默認爲 8KB)下載的數據
  • storlines(cmd, f) 給定 FTP 命令(如「 STOR filename」),用來上傳文本文件。要給定一個文件對象 f
  • storbinary(cmd, f,[,bs=8192]) 與 storlines()相似,只是這個指令處理二進制文件。要給定一個文件對象 f,上傳塊大小 bs 默認爲 8KB
  • rename(old, new) 把遠程文件 old 重命名爲 new
  • delete(path) 刪除位於 path 的遠程文件
  • mkd(directory) 建立遠程目錄
  • rmd(directory) 刪除遠程目錄
  • quit() 關閉鏈接並退出

參考:https://www.cnblogs.com/hltswd/p/6228992.html服務器

問題:Win能運行,Linux出現ftplib.error temp:425 failed to establish connection錯誤

緣由:在於此語句ftp.set_pasv()svg

Window下設置ftp爲主/被動模式,ftp.retrlines()方法不會出現錯誤,Linux 下只能ftp爲主動模式才能夠。函數

解決方法:把ftp_ftp.set_pasv(val=False)的val設置爲False,即設置爲主動模式便可。ui

ftp參數設置連接:https://docs.python.org/3/library/ftplib.html#ftplib.FTP.set_pasvspa