Python Forum

Full Version: A working code to upload a file using sftp?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Can anyone share a presently working Python code that uploads a local file to a publicly accessible FTP server for testing purposes? I have tried several codes published in various web pages, and each time some exception was raised.
Well, I found too many codes for the same thing, can you try the below code, I hope you can get an idea of what you are looking for.

Quote:from ftplib import FTP

# FTP server details
ftp_host = 'ftp.example.com' # Replace with your FTP server address
ftp_user = 'your_username' # Replace with your FTP username
ftp_pass = 'your_password' # Replace with your FTP password

# Local file to upload
local_file_path = 'local_file.txt' # Replace with the path to your local file

# Remote directory where you want to upload the file
remote_directory = '/public_html/' # Replace with the desired remote directory

try:
# Connect to the FTP server
ftp = FTP(ftp_host)
ftp.login(user=ftp_user, passwd=ftp_pass)

# Change to the target directory on the server
ftp.cwd(remote_directory)

# Open the local file in binary mode for uploading
with open(local_file_path, 'rb') as local_file:
# Upload the file to the FTP server
ftp.storbinary('STOR ' + local_file_path, local_file)

print(f"File '{local_file_path}' uploaded successfully to '{remote_directory}'")

# Close the FTP connection
ftp.quit()

except Exception as e:
print(f"An error occurred: {e}")

Thanks
Usually, I just spawn a subprocess that calls the lftp command.
Why not just use Filezilla?

Filezilla uses sftp.

When I make my pathetically simple little webpages, I always make them and test them on this laptop. When everything works the way I want, I upload with Filezilla!

Unless you are are serial uploader!?!
I've come upon this source which gives a working solution for interfacing with a SSH File Transfer Protocol server:
https://docs.couchdrop.io/walkthroughs/u...-with-sftp
An example with paramiko:

from getpass import getpass
from stat import S_IFDIR 
from paramiko import SSHClient, AutoAddPolicy, SFTPAttributes


FILE = "/home/public/test.txt"
DIR = "/home/public"
HOST = "server.domain.tld"


def by_mtime(file: SFTPAttributes) -> float:
    return file.st_mtime, file.filename


with SSHClient() as client:
    client.set_missing_host_key_policy(AutoAddPolicy)
    print("Opening ssh connection")
    client.connect(HOST, username="public", password=getpass())
    print("Connected")
    print("opening sftp")
    with client.open_sftp() as sftp:
        print("Open file for writing")
        with sftp.open(FILE, "wb") as fd:
            fd.write(b"Hello World\n")
        
        print("Reading written file")
        with sftp.open(FILE, "rb") as fd:
            text = fd.read().decode()
            print(text, end="")

        print("Setting chmod to 777")        
        sftp.chmod(FILE, 0o777)
        print("Setting atime and mtime to 0 => 1970-01-01T00:00:00")
        sftp.utime(FILE, (0,0))

        # list all files, sorted by size
        for file in sorted(sftp.listdir_iter(DIR), key=by_mtime):
            # skipping directories
            if file.st_mode & S_IFDIR:
                continue

            # only files bigger than 0 bytes
            if file.st_size > 0:
                print(f"{file.filename} => {file.st_size / 1024 ** 1:.1} KiB")

    print("\nSFTP connection closed")
    stdin, stdout, stderr = client.exec_command("uname -a")
    print(stdout.read().decode())