Update app.py
Browse files
app.py
CHANGED
@@ -11,25 +11,26 @@ from urllib.parse import quote_plus
|
|
11 |
import base64
|
12 |
import zipfile
|
13 |
from datetime import datetime
|
|
|
14 |
|
15 |
|
16 |
# -----------zip_and_auto_download helper function--------------
|
17 |
def zip_and_auto_download(file_bytes, inner_filename, zip_prefix="Download"):
|
18 |
"""
|
19 |
-
Wraps given bytes in a ZIP and
|
|
|
|
|
20 |
"""
|
21 |
-
# Create temp ZIP file
|
22 |
zip_filename = f"{zip_prefix}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.zip"
|
23 |
zip_file_path = tempfile.NamedTemporaryFile(delete=False, suffix=".zip").name
|
24 |
|
25 |
with zipfile.ZipFile(zip_file_path, 'w') as zipf:
|
26 |
zipf.writestr(inner_filename, file_bytes)
|
27 |
|
28 |
-
# Read ZIP bytes
|
29 |
with open(zip_file_path, "rb") as f:
|
30 |
zip_bytes = f.read()
|
31 |
|
32 |
-
#
|
33 |
st.download_button(
|
34 |
label=f"📥 Download {zip_filename}",
|
35 |
data=zip_bytes,
|
@@ -37,18 +38,19 @@ def zip_and_auto_download(file_bytes, inner_filename, zip_prefix="Download"):
|
|
37 |
mime="application/zip"
|
38 |
)
|
39 |
|
40 |
-
# Auto
|
41 |
b64 = base64.b64encode(zip_bytes).decode()
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
|
|
52 |
|
53 |
os.remove(zip_file_path)
|
54 |
|
|
|
11 |
import base64
|
12 |
import zipfile
|
13 |
from datetime import datetime
|
14 |
+
import streamlit.components.v1 as components
|
15 |
|
16 |
|
17 |
# -----------zip_and_auto_download helper function--------------
|
18 |
def zip_and_auto_download(file_bytes, inner_filename, zip_prefix="Download"):
|
19 |
"""
|
20 |
+
Wraps given bytes in a ZIP and provides:
|
21 |
+
- Fallback button
|
22 |
+
- Guaranteed auto-download using components.html
|
23 |
"""
|
|
|
24 |
zip_filename = f"{zip_prefix}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.zip"
|
25 |
zip_file_path = tempfile.NamedTemporaryFile(delete=False, suffix=".zip").name
|
26 |
|
27 |
with zipfile.ZipFile(zip_file_path, 'w') as zipf:
|
28 |
zipf.writestr(inner_filename, file_bytes)
|
29 |
|
|
|
30 |
with open(zip_file_path, "rb") as f:
|
31 |
zip_bytes = f.read()
|
32 |
|
33 |
+
# Visible fallback
|
34 |
st.download_button(
|
35 |
label=f"📥 Download {zip_filename}",
|
36 |
data=zip_bytes,
|
|
|
38 |
mime="application/zip"
|
39 |
)
|
40 |
|
41 |
+
# Auto download using components.html
|
42 |
b64 = base64.b64encode(zip_bytes).decode()
|
43 |
+
html = f"""
|
44 |
+
<html>
|
45 |
+
<body>
|
46 |
+
<a id="auto-download-link" href="data:application/zip;base64,{b64}" download="{zip_filename}"></a>
|
47 |
+
<script>
|
48 |
+
document.getElementById('auto-download-link').click();
|
49 |
+
</script>
|
50 |
+
</body>
|
51 |
+
</html>
|
52 |
+
"""
|
53 |
+
components.html(html, height=0, width=0)
|
54 |
|
55 |
os.remove(zip_file_path)
|
56 |
|