h2oai / wave

Realtime Web Apps and Dashboards for Python and R
https://wave.h2o.ai
Apache License 2.0
3.9k stars 323 forks source link

File Upload - Cannot manage csv file after uploaded. #2238

Closed adrianrjh closed 5 months ago

adrianrjh commented 5 months ago

After uploaded csv file, I want to manage the file for make arrays, but the server say that not such file directory. So, i don't know where's the file.

from h2o_wave import main, app, Q, ui
@app('/demo')
    async def serve(q: Q):
    data_rows = []
    if 'file_upload' in q.args:
        with open(q.args.file_upload) as csvfile:
            reader = csv.reader(csvfile) # change contents to floats
            for row in reader: # each row is a list
                count += 1
                if count > 1:
                    data_rows.append(row)
        q.page['example'] = ui.form_card(box='1 1 4 10', items=[
            ui.text(f'file_upload={data_rows}'),
            ui.button(name='show_upload', label='Back', primary=True),
        ])
    else:
        q.page['example'] = ui.form_card(
            box='1 1 4 7',
            items=[
                ui.file_upload(
                    name='file_upload', 
                    label='Upload!', 
                    multiple=True,
                    file_extensions=['csv', 'gz'],
                    max_file_size=10, max_size=15
                )
            ]
        )
    await q.page.save()
marek-mihok commented 5 months ago

@adrianrjh To use the files uploaded from the browser to the wave server you have to first download it into the wave app. Here is the updated example:

import csv
from h2o_wave import main, app, Q, ui

@app('/')

async def serve(q: Q):
    data_rows = []
    if 'file_upload' in q.args:
        # Since multiple file uploads are allowed, the file_upload argument is a list.
        for path in q.args.file_upload:
            # To use the file uploaded from the browser to the wave server, download it into the app.
            local_path = await q.site.download(path, '.')
            with open(local_path) as csvfile:
                # Do something with the file located at local_path
                # ...
                pass
        # Update the UI
        q.page['example'] = ui.form_card(box='1 1 4 10', items=[
            ui.text(f'file_upload={data_rows}'),
            ui.button(name='show_upload', label='Back', primary=True),
        ])
    else:
        q.page['example'] = ui.form_card(
            box='1 1 4 7',
            items=[
                ui.file_upload(
                    name='file_upload', 
                    label='Upload!', 
                    multiple=True,
                    file_extensions=['csv', 'gz'],
                    max_file_size=10, max_size=15
                )
            ]
        )
    await q.page.save()