-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path19.DesignFileUploadUtility.py
More file actions
69 lines (53 loc) · 2.13 KB
/
19.DesignFileUploadUtility.py
File metadata and controls
69 lines (53 loc) · 2.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# Design a File Uploader Utility that allows users to upload, list, and delete files —
# all stored in-memory. The system must support file size validation (max 5 MB) and
# handle concurrent uploads safely without using any external database.
import threading
import time
import sys
class FileUploader:
def __init__(self, max_size = 5 * 1024 * 1024):
self.storage = {}
self.lock = threading.Lock()
self.max_size = max_size
def upload(self, name, data):
with self.lock:
size = sys.getsizeof(data)
if size > self.max_size:
print(f"Upload failed: '{name}' exceeds {self.max_size/1024/1024:.1f} MB limit")
return
if name in self.storage:
print(f" File '{name}' already exists. Overwriting...")
self.storage[name] = {
"data": data,
"size": size,
"timestamp": time.ctime()
}
print(f" Upload '{name}' ({size} bytes) at {self.storage[name]['timestamp']}")
def list_files(self):
with self.lock:
if not self.storage:
print("No Files Uploaded yet.")
return
print("\n Uploaded Files:")
for name, meta in self.storage.items():
print(f" - {name} | {meta['size']} bytes | Uploaded: {meta['timestamp']}")
def delete(self, name):
with self.lock:
if name in self.storage:
del self.storage[name]
print(f" Deleted File '{name}'")
else:
print(f" File '{name}' not found")
if __name__ == "__main__":
uploader = FileUploader() # create FileUploader instance
# upload two normal files
uploader.upload("demo.txt", "Hello Bharadwaj!")
uploader.upload("data.json", '{"user":"Bharadwaj","lang":"Python"}')
# display uploaded files
uploader.list_files()
# attempt to upload a 6MB oversized file
uploader.upload("big_file.bin", "x" * (6 * 1024 * 1024))
# delete one file
uploader.delete("demo.txt")
# list remaining files
uploader.list_files()