2

I want to upload various data from memory (contents of arrays, static html-code, ...) to a webserver via FTP.

This works for just one basic string 'Hello World':

from ftplib import FTP
import io
...

bio = io.BytesIO(b'Hello World')
ftp.storbinary('STOR index.html', bio)

However, I do not get it right to upload data like:

datalog = array([['Temperature', 0, 0], ['Humidity', 0, 0]])
html_code = '<head><title></title></head><body>display here</body></html>
Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
etechniker
  • 23
  • 3

1 Answers1

5

You can upload files but not variables.

You can use BytesIO or StringIO to create file with your data and upload it. They have functions like normal file - ie. bio.write(html_code.encode()).

from ftplib import FTP
import io

text = '<head><title></title></head><body>display here</body></html>'

bio = io.BytesIO()
bio.write(text.encode())
bio.seek(0)  # move to beginning of file

ftp.storbinary('STOR index.html', bio)

For datalog you can use module json to create string with all data

from ftplib import FTP
import io

import json

datalog = ([['Temperature', 0, 0], ['Humidity', 0, 0]])
text = json.dumps(datalog)

bio = io.BytesIO()
bio.write(text.encode())
bio.seek(0)  # move to beginning of file

ftp.storbinary('STOR data.json', bio)

EDIT: Example with module csv which can't work directly with BytesIO but it needs string file.

from ftplib import FTP
import io

import csv

data = [['Temperature', 0, 0], ['Humidity', 0, 0]]

bio = io.BytesIO()
iow = io.TextIOWrapper(bio)  # create String wrapper

csv_writer = csv.writer(iow) # create csv writer
csv_writer.writerows(data)   # write all rows

iow.flush()  # force String to send all from buffer to file (you can't use `iow.close()` for it)
bio.seek(0)  # move to beginning of file

ftp.storbinary('STOR data.csv', bio)

# to see what is in bio
#bio.seek(0)
#print(bio.read()) 
Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
furas
  • 134,197
  • 12
  • 106
  • 148
  • 1
    The oneliner version would be like this: `ftp.storbinary('STOR index.html', io.BytesIO(text.encode()))`, for the first two example. – Károly Szabó Sep 22 '21 at 09:05