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設定成二進位...