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