File size: 5,099 Bytes
98cccaa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import os
import json
import gradio as gr
from huggingface_hub import HfApi, upload_file, download_file, list_repo_files, delete_file, snapshot_download

# 读取环境变量
HF_TOKEN = os.getenv("HF_TOKEN")
DATASET_REPO = os.getenv("DATASET_REPO")
api = HfApi(token=HF_TOKEN)

# 仓库内存储路径
USER_DB_PATH = "user_db.json"

# 加载用户账号数据
def load_user_db():
    try:
        download_file(repo_id=DATASET_REPO, filename=USER_DB_PATH, local_dir="./tmp", repo_type="dataset")
        with open(f"./tmp/{USER_DB_PATH}", "r", encoding="utf-8") as f:
            return json.load(f)
    except:
        return {}

# 保存用户账号
def save_user_db(db):
    with open(f"./tmp/{USER_DB_PATH}", "w", encoding="utf-8") as f:
        json.dump(db, f, ensure_ascii=False)
    upload_file(path_or_fileobj=f"./tmp/{USER_DB_PATH}", path_in_repo=USER_DB_PATH, repo_id=DATASET_REPO, repo_type="dataset)

# 注册
def register(username, pwd):
    db = load_user_db()
    if username in db:
        return "用户名已存在"
    db[username] = {"pwd": pwd}
    save_user_db(db)
    return "注册成功,请登录"

# 登录校验
def login_check(username, pwd):
    db = load_user_db()
    if username not in db:
        return False, "账号不存在"
    if db[username]["pwd"] != pwd:
        return False, "密码错误"
    return True, "登录成功"

# 获取用户文件列表
def get_user_files(username):
    user_dir = f"users/{username}/"
    all_files = list_repo_files(repo_id=DATASET_REPO, repo_type="dataset")
    user_files = []
    for f in all_files:
        if f.startswith(user_dir):
            file_name = f.replace(user_dir, "")
            user_files.append((file_name, f))
    return user_files

# 上传文件到用户独立目录
def upload_user_file(username, file_obj):
    user_dir = f"users/{username}/"
    file_name = os.path.basename(file_obj.name)
    target_path = user_dir + file_name
    upload_file(path_or_fileobj=file_obj, path_in_repo=target_path, repo_id=DATASET_REPO, repo_type="dataset")
    return f"上传成功:{file_name}"

# 下载文件
def download_user_file(username, file_name):
    user_dir = f"users/{username}/"
    remote_path = user_dir + file_name
    local_save = f"./download_{file_name}"
    download_file(repo_id=DATASET_REPO, filename=remote_path, local_dir="./", repo_type="dataset")
    return local_save

# 删除文件
def del_user_file(username, file_name):
    user_dir = f"users/{username}/"
    remote_path = user_dir + file_name
    delete_file(path_in_repo=remote_path, repo_id=DATASET_REPO, repo_type="dataset")
    return f"已删除:{file_name}"

# Gradio界面
with gr.Blocks(title="HF云端网盘") as demo:
    gr.Markdown("# 云端网盘(账号登录+持久文件存储)")
    username = gr.Textbox(label="用户名")
    pwd = gr.Textbox(label="密码", type="password")
    with gr.Row():
        login_btn = gr.Button("登录")
        reg_btn = gr.Button("注册")
    msg = gr.Textbox(label="提示信息", interactive=False)

    # 网盘区域(登录后显示)
    with gr.Column(visible=False) as disk_panel:
        gr.Markdown("## 文件管理")
        upload_input = gr.File(label="上传文件", file_count="multiple")
        upload_msg = gr.Textbox(label="上传结果", interactive=False)
        file_drop = gr.Dropdown(label="已有文件", choices=[])
        with gr.Row():
            dl_btn = gr.Button("下载选中文件")
            del_btn = gr.Button("删除选中文件")
        dl_out = gr.File(label="下载文件")

    # 注册事件
    def reg_action(u, p):
        res = register(u, p)
        return res
    reg_btn.click(reg_action, inputs=[username, pwd], outputs=[msg])

    # 登录事件
    def login_action(u, p):
        ok, tip = login_check(u, p)
        if ok:
            files = get_user_files(u)
            names = [i[0] for i in files]
            return tip, gr.update(visible=True), gr.update(choices=names)
        else:
            return tip, gr.update(visible=False), gr.update(choices=[])
    login_btn.click(login_action, inputs=[username, pwd], outputs=[msg, disk_panel, file_drop])

    # 上传
    def upload_action(u, files):
        tips = []
        for f in files:
            t = upload_user_file(u, f)
            tips.append(t)
        new_files = get_user_files(u)
        names = [i[0] for i in new_files]
        return "\n".join(tips), gr.update(choices=names)
    upload_input.change(upload_action, inputs=[username, upload_input], outputs=[upload_msg, file_drop])

    # 下载
    def dl_action(u, fname):
        path = download_user_file(u, fname)
        return path
    dl_btn.click(dl_action, inputs=[username, file_drop], outputs=[dl_out])

    # 删除
    def del_action(u, fname):
        tip = del_user_file(u, fname)
        new_files = get_user_files(u)
        names = [i[0] for i in new_files]
        return tip, gr.update(choices=names)
    del_btn.click(del_action, inputs=[username, file_drop], outputs=[upload_msg, file_drop])

if __name__ == "__main__":
    demo.launch(server_name="0.0.0.0")