0%

用Python搭建FTP服务器

说明

在之前的某篇文章中,介绍了告诉传输文件的办法,在文中,我使用了nginx来共享文件,缺点在于Windows的文件编码方式为GBK,在传输中文名的文件的时候,会出错,Windows下搭建FTP服务器的方式还有Windows自带的Internet Information Service 管理器,此法可解决中文问题,但是CPU占用较高,我的电脑上用IIS(Internet Information Service 管理器)搭建的FTP服务器来传松文件的时候,CPU占用超过30%,但是用nginxCPU占用不到5%。所以,今天换另外一个FTP服务器——pyftpdlib

安装

首先,电脑上得有已经安装好的python环境,然后使用pip命令安装

1
pip insstall pyftpdlib

运行

编辑一个纯文本文件,其内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#coding:utf-8
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
#新建一个用户组
authorizer = DummyAuthorizer()
#将用户名,密码,指定目录,权限 添加到里面
authorizer.add_user("fan", "root", "E:/UT_Downloads/", perm="elr")#adfmw
#这个是添加匿名用户,任何人都可以访问,如果去掉的话,需要输入用户名和密码,可以自己尝试
authorizer.add_anonymous("D:/")

handler = FTPHandler
handler.authorizer = authorizer
#开启服务器
server = FTPServer(("127.0.0.1", 21), handler)
server.serve_forever()

其中,E:/UT_Downloads/是需要共享的文件所在路径,可以自行更改,fanroot是用户名和密码,也可以自己改动,而authorizer.add_anonymous("D:/")是用来控制是否允许匿名用户登录的,若是把改行注释(行首加#号),在登录服务器的时候,就需要输入用户名和密码了

将文件名后缀设置为.py,在命令行下切换到该文件所在目录,使用python ***.py就可以打开FTP服务器了

连接展示

nginx搭建的实际上是http服务器,没办法文件管理器里面打开,用pyftpdlib搭建的是可以在文件管理器里面打开的。

存在的问题

  1. 以上示范代码,可以提供文件的下载,但是还不支持文件上传,若有上传文件的需要,可阅读官方的文档
    我编辑此文的时候,还未与nginx的性能相比较过。
  2. Windows下的中文乱码

描述

此问题表现为在浏览器打开FTP服务器是正常的,在文件管理器打开FTP服务器是乱码的。

解决办法

解决方法为更改pyftpdlib的源代码,到https://github.com/giampaolo/pyftpdlib/下载源代码,更改pyftpdlib文件夹下的filesystems.py,第471行和603utf8改为gbk,文件handlers.py1382行的utf8改为gbk,然后在命令行切换到setup.py文件所在的目录,使用命令python setup.py install进行安装。

卸载pyftpdlib

由于之前已经通过命令pip insstall pyftpdlib安装过了,所以用源代码安装的时候会提示已经安装,可以通过命令

1
pip uninstall pyftpdlib

来将之前的pyftpdlib卸载掉,然后再安装更改源代码后的pyftpdlib