原文链接

python实现简易的FTP服务器

  1. from pyftpdlib.authorizers import DummyAuthorizer
  2. from pyftpdlib.handlers import FTPHandler
  3. from pyftpdlib.servers import FTPServer
  4. # 实例化虚拟用户,这是FTP验证首要条件
  5. authorizer = DummyAuthorizer()
  6. path = r'D:\下载'
  7. # 添加用户权限和路径,括号内的参数是(用户名, 密码, 用户目录, 权限)
  8. authorizer.add_user('user', '12345', path, perm='elradfmw')
  9. # 添加匿名用户 只需要路径
  10. authorizer.add_anonymous(path)
  11. # 初始化ftp句柄
  12. handler = FTPHandler
  13. handler.encoding = 'gbk'
  14. handler.authorizer = authorizer
  15. # 监听ip 和 端口,因为linux里非root用户无法使用21端口,所以我使用了2121端口
  16. server = FTPServer(('127.0.0.1', 2121), handler)
  17. # 开始服务
  18. server.serve_forever()

通常,由于编码格式的问题,客户端访问时会出现中文乱码问题

解决

一、filesystem.py

在类 AbstractedFS 中:
增加属性:encoding

  1. @property
  2. def encoding(self):
  3. return self.__encoding
  4. @encoding.setter
  5. def encoding(self,value):
  6. self.__encoding=value
  7. #复制代码
  8. #修改__init__:
  9. def __init__(self, root, cmd_channel,encoding):
  10. #...
  11. #...
  12. self.__encoding=encoding
  13. #并且将本文件中所有'utf8'替换为:self.encoding

二、修改handler

在类 FTPHandler 中:
同样增加属性encoding
复制代码

  1. @property
  2. def encoding(self):
  3. return self.__encodingg
  4. @encoding.setter
  5. def encoding(self,value):
  6. self.__encoding=value
  7. self.fs.encoding=value
  8. #复制代码
  9. #在__init__中增加:
  10. self.__encoding='utf8'
  11. #在方法中 def handle_auth_success(。。。)修改一下(因为改了AbstractFS构造函数):
  12. self.fs = self.abstracted_fs(home, self,self.encoding)

转载https://www.cnblogs.com/xhzxlqt/p/13658481.html)

不想修改也可直接下载替换
filesystem.py
handlers.py