使用Python ftplib上传文件时如何保留源文件的mtime修改时间属性
FTP上传保留源文件修改时间的解决方案
方案1:上传完成后通过MFMT命令设置(兼容性最优)
绝大多数主流FTP服务端(如vsftpd、FileZilla Server等)都支持MFMT扩展命令,专门用于修改远程文件的修改时间,实现步骤如下:
- 读取本地源文件的mtime,转换为
YYYYMMDDHHMMSS格式的UTC时间字符串 - 完成文件上传后,通过ftplib的
sendcmd方法发送MFMT命令即可生效
import os import time from ftplib import FTP # 初始化FTP连接 ftp = FTP('FTP服务端地址') ftp.login(user='登录用户名', passwd='登录密码') local_file = './本地待上传文件路径' remote_file = '/远程服务器保存路径' # 读取本地文件mtime,转换为MFMT要求的UTC时间格式 local_mtime = os.path.getmtime(local_file) utc_mtime = time.gmtime(local_mtime) mtime_format = time.strftime('%Y%m%d%H%M%S', utc_mtime) # 执行文件上传 with open(local_file, 'rb') as f: ftp.storbinary(f'STOR {remote_file}', f) # 设置远程文件修改时间 cmd_resp = ftp.sendcmd(f'MFMT {mtime_format} {remote_file}') # 返回213状态码代表设置成功 if cmd_resp.startswith('213'): print('远程文件修改时间设置完成') ftp.quit()
方案2:服务端不支持MFMT时的替代方案
少部分老旧FTP服务端不支持MFMT,可尝试使用SITE UTIME扩展命令实现,示例代码如下:
# 三个时间戳分别对应atime、mtime、ctime,按顺序传入 cmd_resp = ftp.sendcmd(f'SITE UTIME {remote_file} {int(local_mtime)} {int(local_mtime)} {int(local_mtime)}')
注意:
SITE UTIME属于非标准扩展命令,参数顺序和格式没有统一规范,需要根据你使用的FTP服务端的实际规则调整参数。
特殊情况说明
如果上述两种命令你的FTP服务端都不支持,说明该服务端未提供修改文件时间的能力,你可以考虑切换为SFTP协议实现文件同步,SFTP协议原生支持修改远程文件的属性参数。
转换时间格式时请统一使用UTC时间,避免时区差导致设置的时间出现偏差。
内容的提问来源于stack exchange,提问作者atarax42
相关产品推荐
相关产品推荐

