File size: 1,942 Bytes
37c0c35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from typing import List
import os
import streamlit as st
from streamlit.runtime.uploaded_file_manager import UploadedFile

from zip import zip_files, generate_password

DARA_PATH = "data"
os.makedirs(DARA_PATH, exist_ok=True)

def upload_files(files: List[UploadedFile]):
    for file in files:
        with open(file.name, "wb") as f:
            f.write(file.read())

import base64
def get_binary_file_downloader_html(file_path, text="Download Link"):
    # ダウンロードリンクを作成する関数
    with open(file_path, 'rb') as f:
        data = f.read()
    b64 = base64.b64encode(data).decode()
    href = f'<a href="data:application/octet-stream;base64,{b64}" download="{file_path}">{text}</a>'
    return href

def main():
    st.title("File Zipper")

    # ファイルのアップロード
    files = st.file_uploader("Upload Files", accept_multiple_files=True)

    if files:
        os.chdir(DARA_PATH)
        upload_files(files)

        # zipファイルを作成するためのフォームを表示する
        form = st.form(key='zip_form')
        zip_file_name = form.text_input("Zip file name",
                                        value=f"{os.path.splitext(files[0].name)[0]}.zip")
        submit_button = form.form_submit_button("Create Zip File")

        if submit_button:
            # zipファイルを作成する
            password = generate_password()
            zip_files(src=[file.name for file in files],
                      dst=zip_file_name,
                      password=password)
            # ダウンロードリンクとパスワードの表示
            st.markdown(get_binary_file_downloader_html(zip_file_name,
                                                        text=f"Download {zip_file_name}"),
                        unsafe_allow_html=True)
            st.markdown(f"password: :orange[{password}]")

        os.chdir("../")

if __name__ == '__main__':
    main()