FTP 编程

FTP(File Transfer Protocol)文件传输协议,一般专门用来在互联网上客户端和服务器端进行文件传输使用。

Python 中关于 FTP 的模块是 ftplib,在使用 FTP 功能前需要导入此模块:

# 需要导入相应包,主要是ftplib
import ftplib  # 关于FTP的操作都在这个包里边

FTP 账号

登录 FTP 服务器需要账号,账号分三类:

  1. Real 账户:注册账户
  2. Guest 账户:可能是临时的对某一类人的行为进行允许
  3. Anonymous 账户:匿名账户,允许任何人

账号的分配一般由服务器完成,服务器根据账号功能进行访问控制。

FTP 的 URL

URL 用来表示互联网中某个资源的具体地址,FTP 的 URL 主要由三部分组成:

  • HOST:主机地址,类似于 ftp.mozilla.org,以 ftp 开头
  • DIR:目录,表示文件所在本地的路径,例如 pub/android/focus/1.1-RC1/
  • File:文件名称,例如 Klar-1.1-RC1.apk

如果想完整精确表示 ftp 上某一个文件,需要上述三部分组合在一起。

FTP 默认使用两个端口:20 端口和 21 端口,一般采用默认就可以。

一个完整的 ftp 的 URL 形如:

ftp://ftp.acc.umu.se/Public/EFLIB/README

FTP 的工作流程

FTP 的工作流程如下图:

FTP 的共组流程

  1. 客户端链接远程主机上的 FTP 服务器
  2. 客户端输入用户名和密码(或者”anonymous”和电子邮件地址)
  3. 客户端和服务器进行各种文件传输和信息查询操作
  4. 客户端从远程 FTP 服务器退出,结束传输

示例代码

FTP 示例代码如下所示,可能案例使用 FTP 地址已经失效,如果运行请输入正确 URL:

# 需要导入相应包,主要是ftplib
import ftplib  # 关于FTP的操作都在这个包里边
import os
import socket

# 三部分精确表示在ftp服务器上的某一个文件
# 好多公开ftp服务器访问会出错或者没有反应
HOST = "ftp.acc.umu.se"
DIR = 'Public/EFLIB/'
FILE = 'README'

# 1. 客户端链接远程主机上的FTP服务器
try:
    f = ftplib.FTP()
    # 通过设置调试级别可以方便调试
    f.set_debuglevel(2)
    # 链接主机地址
    f.connect(HOST)
except Exception as e:
    print(e)
    exit()
print("***Connected to host {0}".format(HOST))

# 2. 客户端输入用户名和密码(或者"anonymous"和电子邮件地址)
try:
    # 登录如果没有输入用户信息,则默认使用匿名登录
    f.login()
except Exception as e:
    print(e)
    exit()
print("***Logged in as 'anonymous'")

# 3. 客户端和服务器进行各种文件传输和信息查询操作
try:
    # 更改当前目录到指定目录
    f.cwd(DIR)
except Exception as e:
    print(e)
    exit()
print("*** Changed dir to {0}".format(DIR))

try:
    # 从FTP服务器上下载文件
    # 第一个参数是ftp命令
    # 第二个参数是回调函数
    # 此函数的意思是,执行RETR命令,下载文件到本地后,运行回调函数
    f.retrbinary('RETR {0}'.format(FILE), open(FILE, 'wb').write)
except Exception as e:
    print(e)
    exit()

# 4. 客户端从远程FTP服务器退出,结束传输
f.quit()

This site uses Just the Docs, a documentation theme for Jekyll.