123 lines
3.9 KiB
Plaintext
123 lines
3.9 KiB
Plaintext
from PDAPI import *
|
|
import hashlib
|
|
import os
|
|
import mimetypes
|
|
|
|
RESOURCE_ROOT = os.path.join(os.path.abspath(os.path.join(os.getcwd(), "resource")))
|
|
|
|
|
|
def _sha1_path(sha1_hex):
|
|
return os.path.join(RESOURCE_ROOT, sha1_hex[0:2], sha1_hex[2:4], sha1_hex[4:6], sha1_hex)
|
|
|
|
|
|
def _ensure_dir(path):
|
|
os.makedirs(os.path.dirname(path), exist_ok=True)
|
|
|
|
|
|
def _format_size(size):
|
|
if size < 1024:
|
|
return f"{size} B"
|
|
elif size < 1024 * 1024:
|
|
return f"{size / 1024:.1f} KB"
|
|
elif size < 1024 * 1024 * 1024:
|
|
return f"{size / (1024 * 1024):.1f} MB"
|
|
else:
|
|
return f"{size / (1024 * 1024 * 1024):.1f} GB"
|
|
|
|
|
|
__metadata__ = {
|
|
"methods": ["POST"],
|
|
"blueprint": "GERP",
|
|
"permission": 3.0,
|
|
"attributes": [],
|
|
"limit": "10 per minute",
|
|
}
|
|
|
|
def HandleRequest(_CleanedData):
|
|
current_user = UGM.GetELTUser()
|
|
if not current_user:
|
|
return {"code": 401, "msg": "未登录"}, 401
|
|
|
|
if 'file' not in flask.request.files:
|
|
return {"code": 1, "msg": "未找到上传文件"}, 400
|
|
|
|
file = flask.request.files['file']
|
|
if not file or not file.filename:
|
|
return {"code": 1, "msg": "文件为空"}, 400
|
|
|
|
file_data = file.read()
|
|
if len(file_data) > 50 * 1024 * 1024:
|
|
return {"code": 1, "msg": "文件大小超过50MB限制"}, 400
|
|
|
|
sha1 = hashlib.sha1(file_data).hexdigest()
|
|
|
|
existing = GERPFileAsset.query.filter(GERPFileAsset.FileSHA1 == sha1).first()
|
|
if existing:
|
|
return {
|
|
"code": 0,
|
|
"msg": "文件已存在",
|
|
"data": {
|
|
"assetUUID": UUIDObj(existing.AssetUUID).UpperStr,
|
|
"fileName": existing.FileName,
|
|
"fileSize": existing.FileSize,
|
|
"fileSizeDisplay": _format_size(existing.FileSize),
|
|
"mimeType": existing.MimeType,
|
|
"sha1": existing.FileSHA1,
|
|
"refLink": f"https://api.gvsds.com/Asset/Download/{existing.FileSHA1}",
|
|
"createTime": existing.CreateTime.strftime("%Y-%m-%d %H:%M:%S") if existing.CreateTime else None,
|
|
}
|
|
}, 200
|
|
|
|
storage_path = _sha1_path(sha1)
|
|
_ensure_dir(storage_path)
|
|
|
|
with open(storage_path, 'wb') as f:
|
|
f.write(file_data)
|
|
|
|
mime_type = mimetypes.guess_type(file.filename)[0] or "application/octet-stream"
|
|
|
|
asset_uuid = NewBUUID()
|
|
new_asset = GERPFileAsset()
|
|
new_asset.AssetUUID = asset_uuid
|
|
new_asset.FileName = file.filename
|
|
new_asset.FileSHA1 = sha1
|
|
new_asset.FileSize = len(file_data)
|
|
new_asset.MimeType = mime_type
|
|
new_asset.StoragePath = storage_path
|
|
new_asset.UploaderUUID = current_user.UserUUID
|
|
new_asset.RefCount = 0
|
|
|
|
current_role_uuid_str = flask.request.cookies.get("CurrentRoleUUID")
|
|
if current_role_uuid_str:
|
|
try:
|
|
role_uuid_bytes = UUIDObj(current_role_uuid_str).bytes
|
|
current_role = GERPRole.query.filter(GERPRole.RoleUUID == role_uuid_bytes).first()
|
|
if current_role and current_role.CompanyUUID:
|
|
new_asset.CompanyUUID = current_role.CompanyUUID
|
|
except:
|
|
pass
|
|
|
|
try:
|
|
db.session.add(new_asset)
|
|
db.session.commit()
|
|
except:
|
|
db.session.rollback()
|
|
if os.path.exists(storage_path):
|
|
os.remove(storage_path)
|
|
return {"code": 1, "msg": "数据库写入失败"}, 200
|
|
|
|
return {
|
|
"code": 0,
|
|
"msg": "上传成功",
|
|
"data": {
|
|
"assetUUID": UUIDObj(asset_uuid).UpperStr,
|
|
"fileName": new_asset.FileName,
|
|
"fileSize": new_asset.FileSize,
|
|
"fileSizeDisplay": _format_size(new_asset.FileSize),
|
|
"mimeType": new_asset.MimeType,
|
|
"sha1": new_asset.FileSHA1,
|
|
"refLink": f"https://api.gvsds.com/Asset/Download/{new_asset.FileSHA1}",
|
|
"createTime": new_asset.CreateTime.strftime("%Y-%m-%d %H:%M:%S") if new_asset.CreateTime else None,
|
|
}
|
|
}, 201
|