Python實現FTP檔案傳輸的例項

2022-10-03 09:30:15 字數 3552 閱讀 1898

ftp一般流程

ftp對應pasv和port兩種訪問方式,分別為被動和主動,是針對ftp伺服器端進行區分的,正常傳輸過程中21號埠用於指令傳輸,資料傳輸埠使用其他埠。

pasv:由客戶端發起資料傳輸請求,伺服器端返回並攜帶資料埠,並且伺服器端開始監聽此埠等待資料,為被動模式;

port:客戶端監聽埠並向伺服器端發起請求,伺服器端主動連線此埠進行資料傳輸,為主動模式。

其中type分兩種模式,i對應二進位制模式、a對應ascii模式;

pasv為客戶端傳送請求,之後227為伺服器端返回操作碼表示成功,並且後面帶有伺服器端監聽的埠:143x256(左移8位)+48

之後通過stor命令進行資料**,**完成後返回226表示資料傳輸完成。

2. python**實現:

中文路徑問題:由於ftp支援ascii編碼,python ftplib中編碼方式使用latin-1,而window預設編碼方式為gbk,所以使用python處理時需先將中文路徑編碼為gbk之後解碼為latin-1字元;

上傳**使用storline和retrline,對應二進位制使用storbinary和retrbinary。對於stor類函式後面的引數fp表示接收乙個檔案物件,支援read方法,一程式設計客棧般為開啟需要上傳的原始檔,而retr類函式後面的引數表示對於返回資料的處理方法。

從乙個ftp伺服器到另乙個ftp伺服器的資料傳輸:

利用本地電腦作為資料快取,但並不將資料儲存到硬碟,只在記憶體中儲存進行資料傳輸;其中一端作為**一端為資料上傳。

首先登陸兩個ftp伺服器,transfercmd函式用於傳送命令並返回已建立好連線的本地socket,此時分別在兩個本地socket進行資料的收發即可。

在測試中發現,在傳送完乙個檔案之後只有及時的關閉socket,21埠才會返回226,資料完成指示,這樣才可以迴圈下乙個檔案,在完成之後要退出ftp。

#coding=utf-8

import ftplib,os.path,os

import socket

f1=ftplib.ftp('172.16.2.76')

f2=ftplib.ftp('172.16.25.153')

class myftp:

path='file/download/bbb/'

# ftplib中編碼使用latin-1

title='版本'.encode(encoding='gbk').decode(encoding='latin-1')

path1=path+title www.cppcns.com

localdir='e:\\ver\\fp\\'

path2='abc/edf/'

def __init__(self):

try:

f1.login('username','password')

except ftplib.error_perm:

print('f1 cannot loggin!')

return

try:

f2.login()

except ftplib.error_perm:

print('f2 cannot loggin!')

return

def ftpd(self):

filelist=

filelist=

filels=f1.retrlines('list %s'%(self.path1),callback=filelist.append)

f1.cwd(self.path1)

for file in filelist:

fileattr=file.split(' ')

filename=fileattr[-1]

filetype=fileattr[0][0]

if filetype=='-':

filelist.append(filename)

for file in filelist:

path=self.localdir+file

f1.retrbinary('retr %s'%(file),open(path,'wb').write)

print('%s download.....'%(file))

f1.quit()

def ftpu(self,fun=1):

os.chdir(self.localdir)

filelist=os.listdir()

# upload file

if fun==1:

for file in filelist:

path=self.path2

f2.storbinary('stor %s'%(path+file),open(file,'rb'))

print('%s uploading......'%(file))

#delete file

if fun==0:

try:

for file in filelist:

path=self.path2

f2.delete(path+file)

print('%s delete......'%(file))

except ftplib.error_perm:

print('no file to delete!!')

return

f2.quit()

def test(self):

f1.cwd(self.path1)

f2.cwd(self.path2)

filelist=f1.nlst()

print(filelist)

for file in filelist:

print('transfer %s......'%(file))

f1.voidcmd('type i')

f2.voidcmd('type i')

sock1=f1.transfercmd('retr %s'%(file))

sock2=f2.transfercmd('stor %s'%(file))

while 1:

d程式設計客棧ata=sock1.recv(1024)

sock2.sendall(data)

www.cppcns.com

if len(data)==0:

break

# 資料傳送完成後需關閉socket,伺服器21埠才會有返回 lkwfnphdt

sock1.close()

sock2.close()

res1=f1.getresp()

#print('f1 >> %s'%(res1))

res2=f2.getresp()

#print('f2 >> %s'%(res2))

f1.quit()

f2.quit()

if __name__=='__main__':

ftptest=myftp()

ftptest.ftpu(0)

#ftptest.test()

#ftptest.ftpd()

本文標題: python實現ftp檔案傳輸的例項

本文位址:

FTP檔案傳輸

ftp專案作業 要求 1.使用者加密認證 2.允許同時多使用者登入 3.每個使用者有自己的家目錄,且只能訪問自己的家目錄 4.對使用者進行磁碟配額,每個使用者的可用空間不同 5.允許使用者在ftp server上隨意切換目錄 6.允許使用者檢視當前目錄下的檔案 8.檔案傳輸過程中顯示進度條 9.支援...

FTP 檔案傳輸協議

1.什麼是ftp 檔案傳輸協議 英文 file transfer protocol,簡稱為ftp 是用於在網路上進行檔案傳輸的一套標準協議。它屬於網路傳輸協議的應用層。ftp是乙個8位的客戶端 伺服器協議,能操作任何型別的檔案而不需要進一步處理,就像mime或unencode一樣。缺點 ftp有著極...

FTP檔案傳輸格式

ftp可用多種格式傳輸檔案,通常由系統決定。大多數系統 包括unix系統 只有兩種模式 文字模式和二進位制模式。文字傳輸器使用ascii字元,並由回車鍵和換行符分開,而二進位制不用轉換或格式化就可傳字元,二進位制模式比文字模式更快,並且可以傳輸所有ascii值,所以系統管理員一般將ftp設定成二進位...