Python 玩 SFTP,如何实现断点续传?

用 paramiko.没发现有这样的功能啊。有达人能指点下么?

冰天雪地裸奔跪求。
Python 玩 SFTP,如何实现断点续传?

1 回复

核心思路:paramikoSFTPClient.get 方法,配合 localpath'ab' 追加写入模式和 callback 回调跳过已下载部分。

关键代码示例:

import os
import paramiko
from paramiko import SSHClient, AutoAddPolicy

def sftp_resume_download(host, port, username, password, remote_path, local_path):
    """SFTP断点续传下载函数"""
    ssh = SSHClient()
    ssh.set_missing_host_key_policy(AutoAddPolicy())
    
    try:
        ssh.connect(host, port, username, password)
        sftp = ssh.open_sftp()
        
        # 获取远程文件大小
        remote_size = sftp.stat(remote_path).st_size
        
        # 获取本地已下载大小(如果文件存在)
        local_size = os.path.getsize(local_path) if os.path.exists(local_path) else 0
        
        # 如果本地文件已完整,直接返回
        if local_size == remote_size:
            print(f"文件已完整下载: {local_path}")
            return
        
        # 以追加二进制模式打开本地文件
        with open(local_path, 'ab') as f:
            # 定义回调函数来显示进度
            def callback(transferred, total):
                percent = (local_size + transferred) / remote_size * 100
                print(f"\r下载进度: {percent:.1f}%", end='')
            
            # 关键:从断点位置开始下载
            sftp.get(remote_path, f, 
                    callback=callback if local_size > 0 else None)
        
        print(f"\n下载完成: {local_path}")
        
    finally:
        sftp.close() if 'sftp' in locals() else None
        ssh.close()

# 使用示例
sftp_resume_download(
    host='your_host',
    port=22,
    username='your_user',
    password='your_pass',
    remote_path='/remote/path/file.zip',
    local_path='./local_file.zip'
)

要点说明:

  1. 'ab' 模式确保在已有文件末尾追加数据
  2. os.path.getsize() 获取已下载大小作为断点位置
  3. 实际下载时 paramiko 会自动从文件末尾继续传输

一句话建议: 用追加写入模式配合本地文件大小检测就能实现基础断点续传。

回到顶部