文件傳輸協(xié)議(FTP)主要用于匿名下載公共文件,也可用于兩臺計算機之間的傳輸文件,特別是在使用 windows 進(jìn)行工作,而文件存儲系統(tǒng)使用 UNIX 的情況下。早在 web 流行前,F(xiàn)TP 就是網(wǎng)上進(jìn)行文件傳輸及下載軟件和源代碼的主要手段之一。
FTP 要求輸入用戶名和密碼才能訪問遠(yuǎn)程 FTP 服務(wù)器,但也允許匿名訪問,不過管理員要先設(shè)置 FTP 服務(wù)器以允許匿名用戶登錄,這時匿名用戶的用戶名是"anonymous",密碼一般是用戶的電子郵件地址。
FTP 的整個工作流程如下:
1.客戶端連接遠(yuǎn)程主機上的 FTP 服務(wù)器
2.客戶端輸入賬號密碼(或“anonymous”和電子郵件地址)
3.客戶端進(jìn)行各種文件傳輸和信息查詢操作
4.客戶端從遠(yuǎn)程 FTP 服務(wù)器退出,結(jié)束傳輸
當(dāng)然這只是一般情況下的傳輸,有時由于網(wǎng)絡(luò)原因,或兩邊計算機崩潰回導(dǎo)致傳輸在完成之前中斷。如果客戶端超過15分鐘(900秒)沒有響應(yīng),F(xiàn)TP 連接就會超時并中斷
在使用 Python 的 FTP 支持時,所需要做的只是導(dǎo)入 ftplib 模塊,并實例化一個 ftplib.FTP類對象。所有 FTP 操作(登錄,傳輸文件,注銷等)都要使用這個對象進(jìn)行操作。
下面是一段 Python 的偽代碼
from ftplib import FTP
f = FTP('some.ftp.server')
f.login('anonymous','your@email.address')
.
.
.
f.quit()
客戶端 FTP 程序示例
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import ftplib
import os
import socket
HOST = 'FTP服務(wù)器'
DIRN = '文件路徑'
FILE = '保存的路徑'
def main():
try:
f = ftplib.FTP(HOST) #創(chuàng)建一個 FTP 對象,嘗試連接到 FTP 服務(wù)器
except (socket.error,socket.gaierror) as e:
print('error:cannot reach "%s"' % HOST)
return
print('...connected to host "%s"' % HOST)
try:
f.login() #嘗試用“anonymous”登錄
except ftplib.error_perm as e:
print('error:cannot login anonymously')
f.quit()
return
print('...logged in as "anonymously"')
try:
f.cwd(DIRN) #嘗試設(shè)置目錄路徑
except ftplib.error_perm as e:
print('error:cannot CD to "%s"' % DIRN)
f.quit()
return
print('...changed to "%s" forder' % DRIN)
try:
f.retrbinary('RETR %s' % FILE,open(FILE,'wb').write) #嘗試下載文件,并將文件寫入到 FILE文件
except ftplib.error_perm as e:
print('error:cannot read file "%s"' % FILE)
os.unlink(FILE)
else:
print('...downloaded "%s" to CWD' % FILE)
f.quit()
if __name__ == '__main__':
main()