diff --git a/appstore.py b/appstore.py index 8ca32f66..c5fe3a87 100644 --- a/appstore.py +++ b/appstore.py @@ -429,6 +429,29 @@ create_drawer() +# Create file explorer widget +file_explorer = lv.file_explorer(subwindow) +file_explorer.set_root_path("/") +file_explorer.explorer_open_dir('/') +file_explorer.set_size(210, 210) +file_explorer.set_mode(lv.FILE_EXPLORER.MODE.DEFAULT) # Default browsing mode +file_explorer.set_sort(lv.FILE_EXPLORER.SORT.NAME_ASC) # Sort by name, ascending +file_explorer.align(lv.ALIGN.CENTER, 0, 0) +def file_explorer_event_cb(e): + code = e.get_code() + obj = e.get_target_obj() + if code == lv.EVENT.VALUE_CHANGED: + #selected_path = obj.get_selected_file_name() + selected_path = file_explorer.explorer_get_selected_file_name + print("Selected:", selected_path) + if obj.is_selected_dir(): + print("This is a directory") + else: + print("This is a file") + + +# Attach event callback +file_explorer.add_event_cb(file_explorer_event_cb, lv.EVENT.VALUE_CHANGED, None) @@ -603,6 +626,13 @@ print("Launcher script exiting") run_app(launcher_script,False,False) + + + + + + + import network import time @@ -626,17 +656,39 @@ def connect_wifi(): connect_wifi() + + + #import mip #mip.install('github:miguelgrinberg/microdot/src/microdot/microdot.py') +# http://192.168.1.122/upload +# http://192.168.1.122/files// from microdot import Microdot, Response import os +# HTML template for the upload form +UPLOAD_FORM = ''' + + +File Manager + +

File Manager

+

View Files

+

Upload File

+
+ + +
+ + +''' + app = Microdot() @app.route('/') async def index(request): - return 'Hello, world!' + return 'Files' @app.route('/files/') @@ -673,6 +725,41 @@ async def download_file(req, path): return Response(f'Error: {e}', status_code=404) + +@app.route('/upload', methods=['GET']) +async def upload_form(req): + return Response(UPLOAD_FORM, headers={'Content-Type': 'text/html'}) + + + +@app.route('/upload', methods=['POST']) +async def upload_file(req): + try: + # Check if form data contains a file + if 'file' not in req.form or not req.files['file']['filename']: + return Response('No file selected', status_code=400) + # Get file details + filename = req.files['file']['filename'] + file_content = req.files['file']['body'] + # Sanitize filename to prevent path traversal + filename = filename.split('/')[-1].split('\\')[-1] + if not filename: + return Response('Invalid filename', status_code=400) + # Save file to filesystem + file_path = f'/{filename}' + with open(file_path, 'wb') as f: + f.write(file_content) # Write in one go for small files + # Free memory + gc.collect() + # Redirect to file listing + return Response(status_code=302, headers={'Location': '/files'}) + except OSError as e: + return Response(f'Error saving file: {e}', status_code=500) + except MemoryError: + return Response('File too large for available memory', status_code=507) + + + def startit(): app.run(port=80) # http://192.168.1.115:5000 @@ -680,3 +767,4 @@ def startit(): import _thread _thread.start_new_thread(startit, ()) +