2

I want to upload large zip files from google cloud bucket to SFTP server without loading into memory and cloud function. I am using pysftp for SFTP transfer.

with pysftp.Connection(host="SFTP Server", username='test', password='test', cnopts=cnopts) as sftp:
    sftp.cwd("/tmp")
    sftp.put("zip_file_from_google_bucket")

Can we access os path of the file in the bucket and provide the file path in the sftp.put() since gs:// path will not be recognised in the sftp.put()?

Do we have any other method to transfer?

Please advice.

Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
PROTOCOL
  • 371
  • 9
  • 17

1 Answers1

2

First, better use Paramiko. The pysftp is dead. See pysftp vs. Paramiko. In any case, the following will work both with Paramiko and pysftp.


Combine Paramiko SFTPClient.open with GCS Blob.download_to_file:

client = storage.Client(credentials=credentials, project='myproject')
bucket = client.get_bucket('mybucket')
blob = bucket.blob('archive.zip')

with sftp.open('/sftp/path/archive.zip', mode="w+", bufsize=32768) as f:
    blob.download_to_file(f)

Alternatively, combine SFTPClient.putfo with Blob.open.

with blob.open("rb") as f:
    sftp.putfo(f, '/sftp/path/archive.zip')

(untested, but it should give you the idea at least)

Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992