Skip to content

Commit d988d5b

Browse files
author
Lan
committed
feat:新增分享服务器本地文件,传到/opt/filecodebox/local里面
1 parent 8359895 commit d988d5b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+752
-436
lines changed

apps/admin/views.py

Lines changed: 90 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,18 @@
33
# @File : views.py
44
# @Software: PyCharm
55
import math
6+
import os
7+
import time
68

7-
from fastapi import APIRouter, Depends
9+
from fastapi import APIRouter, Depends, Form
10+
from pydantic import BaseModel
811

912
from apps.admin.depends import admin_required
1013
from apps.admin.pydantics import IDData
1114
from apps.base.models import FileCodes, KeyValue
15+
from apps.base.utils import get_expire_info, get_file_path_name
1216
from core.response import APIResponse
13-
from core.settings import settings
17+
from core.settings import settings, data_root
1418
from core.storage import FileStorageInterface, storages
1519

1620
admin_api = APIRouter(
@@ -91,3 +95,87 @@ async def file_download(id: int):
9195
return APIResponse(detail=file_code.text)
9296
else:
9397
return await file_storage.get_file_response(file_code)
98+
99+
100+
class LocalFileClass:
101+
def __init__(self, file):
102+
self.file = file
103+
self.path = data_root / 'local' / file
104+
self.ctime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.path.getctime(self.path)))
105+
self.size = os.path.getsize(self.path)
106+
107+
async def read(self):
108+
return open(self.path, 'rb')
109+
110+
async def write(self, data):
111+
with open(self.path, 'w') as f:
112+
f.write(data)
113+
114+
async def delete(self):
115+
os.remove(self.path)
116+
117+
async def exists(self):
118+
return os.path.exists(self.path)
119+
120+
121+
@admin_api.get('/local/lists', dependencies=[Depends(admin_required)])
122+
async def get_local_lists():
123+
files = []
124+
for file in os.listdir(data_root / 'local'):
125+
files.append(LocalFileClass(file))
126+
return APIResponse(detail=files)
127+
128+
129+
class DeleteItem(BaseModel):
130+
filename: str
131+
132+
133+
@admin_api.delete('/local/delete', dependencies=[Depends(admin_required)])
134+
async def delete_local_file(item: DeleteItem):
135+
file = LocalFileClass(item.filename)
136+
if await file.exists():
137+
await file.delete()
138+
return APIResponse(detail='删除成功')
139+
return APIResponse(code=404, detail='文件不存在')
140+
141+
142+
class ShareItem(BaseModel):
143+
expire_value: int
144+
expire_style: str = 'day'
145+
filename: str
146+
147+
148+
class File:
149+
def __init__(self, file):
150+
self.file = file
151+
152+
153+
@admin_api.post('/local/share', dependencies=[Depends(admin_required)])
154+
async def share_local_file(item: ShareItem):
155+
file = LocalFileClass(item.filename)
156+
if not await file.exists():
157+
return APIResponse(code=404, detail='文件不存在')
158+
text = File(await file.read())
159+
expired_at, expired_count, used_count, code = await get_expire_info(item.expire_value, item.expire_style)
160+
# 获取文件路径和名称
161+
path, suffix, prefix, uuid_file_name, save_path = await get_file_path_name(item)
162+
# 保存文件
163+
file_storage: FileStorageInterface = storages[settings.file_storage]()
164+
await file_storage.save_file(text, save_path)
165+
# 创建一个新的FileCodes实例
166+
await FileCodes.create(
167+
code=code,
168+
prefix=prefix,
169+
suffix=suffix,
170+
uuid_file_name=uuid_file_name,
171+
file_path=path,
172+
size=file.size,
173+
expired_at=expired_at,
174+
expired_count=expired_count,
175+
used_count=used_count,
176+
)
177+
# 返回API响应
178+
return APIResponse(detail={
179+
'code': code,
180+
'name': file.file,
181+
})

fcb-fronted/components.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ declare module 'vue' {
1414
ElContainer: typeof import('element-plus/es')['ElContainer']
1515
ElDialog: typeof import('element-plus/es')['ElDialog']
1616
ElDrawer: typeof import('element-plus/es')['ElDrawer']
17+
ElEmpty: typeof import('element-plus/es')['ElEmpty']
1718
ElForm: typeof import('element-plus/es')['ElForm']
1819
ElFormItem: typeof import('element-plus/es')['ElFormItem']
1920
ElHeader: typeof import('element-plus/es')['ElHeader']

fcb-fronted/dist/assets/AboutView-C9NDvQ3V.js renamed to fcb-fronted/dist/assets/AboutView-MQgWyZAQ.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

fcb-fronted/dist/assets/AdminView-CL7mmOac.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

fcb-fronted/dist/assets/AdminView-DCdW5fL2.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

fcb-fronted/dist/assets/CardTools-4F6WeaAR.css

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

fcb-fronted/dist/assets/CardTools.vue_vue_type_script_setup_true_lang-D3a_lkdX.js

Lines changed: 296 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

fcb-fronted/dist/assets/FileView-DedH_wkX.js

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

fcb-fronted/dist/assets/FileView-e5CSuy2N.js

Lines changed: 0 additions & 14 deletions
This file was deleted.

fcb-fronted/dist/assets/HomeView-4TAzKov5.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)