import gradio as gr import os import shutil from pymongo.mongo_client import MongoClient from pymongo.server_api import ServerApi import urllib.parse from bson.objectid import ObjectId username = urllib.parse.quote_plus(os.getenv('MONGO_USERNAME')) password = urllib.parse.quote_plus(os.getenv('MONGO_PASSWORD')) restUri = os.getenv('REST_URI') uri = f'mongodb+srv://{username}:{password}{restUri}' client = MongoClient(uri, server_api=ServerApi('1')) db = client['file_storage'] references_collection = db['references'] try: client.admin.command('ping') print("Pinged your deployment. You successfully connected to MongoDB!") except Exception as e: print(e) theme = gr.themes.Default( primary_hue="blue", secondary_hue="violet", neutral_hue="slate", ).set( button_secondary_background_fill='*secondary_200', button_secondary_background_fill_hover='*secondary_300', button_secondary_background_fill_dark='*secondary_600', button_secondary_background_fill_hover_dark='*secondary_500', button_secondary_border_color='*secondary_200', button_secondary_border_color_hover='*secondary_300', button_secondary_border_color_dark='*secondary_600', button_secondary_border_color_hover_dark='*secondary_500', button_secondary_text_color='*secondary_700' ) def upload(file, secret): if secret == os.environ.get('SECRET_KEY'): root_directory = '/tmp/gradio' folder_contents_dict = get_folder_contents_dict(root_directory) base_url = "https://abhicodes-file-sharing-system.hf.space/file=/tmp/gradio" urls = [f"{base_url}/{folder}/{file}" for folder, files in folder_contents_dict.items() for file in files] references_collection.update_one({"_id": ObjectId('66531a797cbaa19ba4e441c5')}, {"$set": {"urls": urls}}) gr.Info("Uploaded Successfully") else: for ele in file: dir_to_remove = os.path.dirname(ele) shutil.rmtree(dir_to_remove) gr.Warning("Unauthorized to upload") def get_folder_contents_dict(root_dir): folder_contents = {} for item in os.listdir(root_dir): item_path = os.path.join(root_dir, item) if os.path.isdir(item_path): contents = os.listdir(item_path) folder_contents[item] = contents return folder_contents def generate_markdown(json_data): urls = json_data.get("urls", []) markdown_lines = [] count = 1 for url in urls: encoded_url = urllib.parse.quote(url, safe=':/') filename = url.split('/')[-1] encoded_filename = urllib.parse.quote(filename).replace("%20", " ") markdown_lines.append(f'> {count}. {encoded_filename}') count += 1 return "\n".join(markdown_lines) def get_uploads(secret): if secret == os.environ.get('SECRET_KEY'): result = references_collection.find_one({"_id": ObjectId('66531a797cbaa19ba4e441c5')}, {"_id": 0}) if result: markdown_output = generate_markdown(result) gr.Info("Recieved uploaded files") return markdown_output else: return '''

No result found

''' else: return '''

Invalid Secret Key

''' def get_notes(secret): if secret == os.environ.get('SECRET_KEY'): result = references_collection.find_one({"_id": ObjectId('6655fe4ca6913aa201819e72')}, {"_id": 0}) if result: gr.Info("Recieved shared notes") return result['notes'] else: gr.Info("No result found") return '''No result found''' else: gr.Warning("Invalid Secret Key") return '''Invalid Secret Key''' def save_notes(note, secret): if secret == os.environ.get('SECRET_KEY'): result = references_collection.update_one({"_id": ObjectId('6655fe4ca6913aa201819e72')}, {"$set": {"notes": note}}) if result: gr.Info("Notes saved successfully.") return note else: gr.Info("No result found") return '''No result found''' else: gr.Warning("Invalid Secret Key") return note def delete_path(path): try: if os.path.isfile(path): os.remove(path) filename = os.path.basename(path) root_directory = '/tmp/gradio' folder_contents_dict = get_folder_contents_dict(root_directory) base_url = "https://abhicodes-file-sharing-system.hf.space/file=/tmp/gradio" urls = [f"{base_url}/{folder}/{file}" for folder, files in folder_contents_dict.items() for file in files] references_collection.update_one({"_id": ObjectId('66531a797cbaa19ba4e441c5')}, {"$set": {"urls": urls}}) gr.Info(f"The file {filename} has been deleted successfully.") elif os.path.isdir(path): shutil.rmtree(path) foldername = os.path.basename(path) root_directory = '/tmp/gradio' folder_contents_dict = get_folder_contents_dict(root_directory) base_url = "https://abhicodes-file-sharing-system.hf.space/file=/tmp/gradio" urls = [f"{base_url}/{folder}/{file}" for folder, files in folder_contents_dict.items() for file in files] references_collection.update_one({"_id": ObjectId('66531a797cbaa19ba4e441c5')}, {"$set": {"urls": urls}}) gr.Info(f"The directory {foldername} has been deleted successfully.") else: print(f"The path {path} does not exist.") gr.Warning("Invalid action.") except Exception as e: print(f"An error occurred while deleting {path}: {e}") gr.Warning("Invalid action.") def delete_files(path, secret): if secret == os.environ.get('SECRET_KEY'): for paths in path: delete_path(paths) else: gr.Warning("Invalid Secret Key") return gr.update(root_dir="/tmp/gradio") def toogle_visibility(secret): if secret == os.environ.get('SECRET_KEY'): return gr.update(visible=False), gr.update(visible=True), gr.update(visible=True) else: raise gr.Error("Invalid Secret Key") def toogle_vis(): return gr.update(visible=True) def toogle_vis2(): return gr.update(visible=False), gr.update(visible=True), gr.update(visible=False) js = ''' function test() { document.title = "File Sharing System"; var link = document.createElement('link'); link.type = 'image/x-icon'; link.rel = 'shortcut icon'; link.href = 'https://cdn3d.iconscout.com/3d/premium/thumb/cloud-storage-5402862-4521475.png'; document.getElementsByTagName('head')[0].appendChild(link); var manifest = document.createElement('link'); manifest.rel = 'manifest'; manifest.href = 'https://api.npoint.io/fdf723018418571a93a8'; document.getElementsByTagName('head')[0].appendChild(manifest); function updateHeroContainerStyle() { if (window.innerWidth <= 600) { const ele = document.querySelector(".hero-container"); if (ele) { ele.style.flexDirection = 'column'; ele.style.padding = '5px'; ele.style.margin = '0px'; ele.style.gap = '0px'; } } else { const ele = document.querySelector(".hero-container"); if (ele) { ele.style.flexDirection = 'row'; ele.style.padding = '5px'; ele.style.margin = '0px 20px 0px 20px'; ele.style.gap = '50px'; } } } updateHeroContainerStyle(); window.addEventListener('resize', updateHeroContainerStyle); } ''' css = ''' body::-webkit-scrollbar { display: none; scroll:smooth; } .hero-container { display: flex; flex-direction: row; gap:50px; justify-content: center; align-items: center; padding: 5px; border-radius: 10px; max-width: 100%; margin: 20px; margin-top: 0px; margin-bottom: 0px; } .logo { width: 80px; } .description { text-align: justify; } footer { visibility: hidden } ''' with gr.Blocks(theme=theme, js=js, css=css) as demo: gr.Markdown('''

File Storing and Sharing System

''') with gr.Column(): gr.Markdown('''

This project is a file storing and sharing system built using Gradio for the front-end interface and MongoDB for the back-end database. The system allows users to upload files, which are then stored and managed within a specified directory. URLs for accessing these files are generated and stored in a MongoDB collection, making it easy to share and access the uploaded files.

''') secret_key = gr.Text(label="🔐 Secret Key", placeholder="Enter your secret key here...", type="password", autofocus=True) with gr.Row(): with gr.Column(): gr.Markdown('''

uploadUploader

''') input = gr.File(label="Upload", file_count="multiple") input.upload(fn=upload, inputs=[input, secret_key]) with gr.Column(): gr.Markdown('''

downloadDownloader

''') uploads = gr.Markdown(label="Uploads") get_upload_button = gr.Button("Get Uploads", variant='primary') get_upload_button.click(fn=get_uploads, inputs=secret_key, outputs=uploads) initial_delete_button = gr.Button("Delete Uploads?", variant="stop", visible=True) cancel_button = gr.Button("Cancel", variant="secondary", visible=False) with gr.Column(visible=False) as temp: gr.Markdown('''

downloadNavigator

''') file_exe = gr.FileExplorer(root_dir="/tmp/gradio") final_delete_button = gr.Button("Delete", variant="stop", visible=False) final_delete_button.click(fn=delete_files, inputs=[file_exe, secret_key], outputs=file_exe) file_exe.change(fn=toogle_vis, outputs=final_delete_button) initial_delete_button.click(fn=toogle_visibility, inputs=secret_key, outputs=[initial_delete_button, cancel_button, temp]) cancel_button.click(fn=toogle_vis2, outputs=[temp, initial_delete_button, cancel_button]) notes = gr.TextArea(label="📝 Share Notes", placeholder="Enter your notes...") with gr.Row(): get_notes_button = gr.Button("Get Notes", variant="secondary") get_notes_button.click(fn=get_notes, inputs=secret_key, outputs=notes) save_notes_button = gr.Button("Save", variant="primary") save_notes_button.click(fn=save_notes, inputs=[notes,secret_key], outputs=notes) gr.Markdown('''> To know more read the docs at: [Documentation](https://huggingface.co/spaces/abhicodes/file-sharing-system/blob/main/README.md)''') demo.launch(debug=True)