Files
SMANAGE/_api_backup/TempLateAPI/GERP/API/Asset/Upload.api
T
2026-06-16 11:55:14 +08:00

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