Search code examples
pythonfile-uploadftpftplibstreamlit

Streamlit upload CSV file, parse it and push it to FTP


I am trying to build a simple Streamlit app, where, I am uploading a CSV file, then loads it into dataframe, display the dataframe, and then upload it to a pre-defined FTP server.

The first part is working, the file is successfully uploaded and visualized, but then I cannot upload it to the FTP server. This is my code:

import ftplib

import pandas as pd
import streamlit as st

ftp_server = "ftp.test.com"
ftp_username = "user"
ftp_password = "password"

input_file = st.file_uploader("Upload a CSV File",type=['csv'])
if (input_file is not None) and input_file.name.endswith(".csv"):
    df = pd.read_csv(input_file, delimiter="\t", encoding = 'ISO-8859-1')
    st.dataframe(df)
    session = ftplib.FTP(ftp_server, ftp_username, ftp_password)
    file = open(input_file, "rb")
    session.storbinary(input_file.name, input_file)              
    input_file.close()                                    
    session.quit()
    st.success(f"The {input_file.name} was successfully uploaded to the FTP server: {ftp_server}!")

I am getting an error that

TypeError: expected str, bytes or os.PathLike object, not UploadedFile.

I am using Streamlit v.1.1.0.

Please note that I have simplified my code and replaced the FTP credentials. In the real world, I would probably use try/except for the session connection, etc.


Solution

    1. I guess you get the error here:

      file = open(input_file, "rb")
      

      That line is both wrong and useless (you never use the file). Remove it.

    2. You might need to seek the input_file back to the beginning after you have read it in read_csv:

      file_input.seek(0)
      
    3. You are missing the upload command (STOR) the storbinary call:

      session.storbinary("STOR " + input_file.name, input_file)