面向 cc 的编程规则,帮助你在任意页面仅通过 cid 即可加载与使用存储工具,无需关注 Provider 细节。
cid:使用 NovaStorage.withCid(cid) 自动选择企业账套 Provider。NovaFile,含 key, url, name, type, size, metadata, md5 等。storage/company/<cid>/<prefixKey?>/<YYYYMMDD>/<HHmmss-rand>-<name>。prefixKey 在公司段后、日期目录前插入自定义目录(自动去除首尾斜杠)。getAttachmentByMd5 与 saveAttachment,避免重复上传并统一写入 Attachment。import { NovaStorage, NovaFile } from 'fmode-ng/core';
const cid = localStorage.getItem('company')!; // 或服务获取
const storage = await NovaStorage.withCid(cid);
const file = (event.target as HTMLInputElement).files![0];
const uploaded: NovaFile = await storage.upload(file, {
prefixKey: 'project/pid/', // 项目页需要加项目前缀
onProgress: (p) => console.log('progress %', p.total.percent),
});
console.log(uploaded.key, uploaded.url);
Attachment 表结构分析Attachment 表是 Parse 服务中用于存储文件附件核心信息的业务表,主要关联文件元数据、上传用户、所属公司/分类等维度,支撑附件的管理、查询与关联业务(如文档附件、媒体文件关联等)。
用于记录附件的基础属性(名称、大小、URL)、校验信息(MD5)、关联主体(用户、公司、分类)及文件元数据(分辨率、时长等),是附件与业务模块(如内容、用户系统)的关联枢纽。
以下字段为代码中明确通过 attachment.set(...) 定义的业务字段,涵盖附件的核心属性与关联关系:
| 字段名 | 数据类型 | 赋值逻辑 | 字段含义 | 可选性 |
|---|---|---|---|---|
size |
Number(整数) | 取自 file.size(NovaFile 或传入对象的 size 字段,单位:字节) |
附件文件的实际大小,用于前端展示、容量统计等 | 必选 |
url |
String | 1. 优先取 file.url;2. 若 url 非 HTTP 开头,拼接 domain 前缀;3. 清除 undefined/ 无效前缀 |
附件的可访问地址(绝对 URL),用于前端下载、预览附件 | 必选 |
name |
String | 取自 file.name(NovaFile 或传入对象的文件名,含扩展名) |
附件的原始文件名(如 test.jpg),用于前端展示、文件识别 |
必选 |
mime |
String | 取自 file.type(MIME 类型,如 image/jpeg、audio/mp3、video/mp4) |
附件的文件类型,用于判断文件类别(图片/音视频/文档)、前端渲染方式 | 必选 |
md5 |
String | 1. 优先取 file.md5;2. 若有 srcFile(原始 File/Blob),通过 calcFileMd5 计算 |
附件文件的 MD5 哈希值,用于文件完整性校验(避免传输损坏)、去重判断 | 可选 |
metadata |
Object(嵌套结构) | 取自 file.metadata(若传入则直接存储,无则不主动生成) |
附件的文件元数据,随文件类型不同包含不同子字段(见下方补充) | 可选 |
company |
Parse Pointer(关联 Company 表) |
取值优先级:categoryId > this.cid > localStorage 的 company 值 |
关联附件所属的公司,用于数据隔离(不同公司只能查看自己的附件) | 可选 |
category |
Parse Pointer(关联 Category 表) |
取自传入的 categoryId 参数 |
关联附件所属的分类(如“产品图片”“合同附件”),用于附件分类管理 | 可选 |
user |
Parse Pointer(关联 _User 表) |
取自 Parse.User.current()(当前登录用户),生成指向 _User 表的指针 |
记录附件的上传用户,用于追溯上传人、权限控制(如仅上传者可编辑) | 可选(无当前用户时不设置) |
metadata 字段的常见子字段metadata 存储文件的个性化元数据,具体子字段由文件类型决定(依赖 getFileMetadata 函数提取):
| 子字段 | 数据类型 | 适用文件类型 | 含义 |
|----------------|----------|--------------------|----------------------------------------------------------------------|
| width | Number | 图片、视频 | 分辨率宽度(如图片 1920px,视频 1280px) |
| height | Number | 图片、视频 | 分辨率高度(如图片 1080px,视频 720px) |
| duration | Number | 音频、视频 | 媒体时长(单位:秒,如音频 120s,视频 300s) |
| lastModified | Number | 所有文件 | 文件最后修改时间戳(取自 file.lastModified 或当前时间) |
| bitrate | Number | 音频、视频(预留) | 媒体码率(代码类型定义中存在,暂未在 extractMediaMetadata 中实现) |
| codec | String | 音频、视频(预留) | 媒体编码格式(如 H.264、MP3,暂未实现) |
| colorDepth | Number | 图片(预留) | 图片色深(如 24 位真彩色,暂未实现) |
所有 Parse Object(包括 Attachment)都会自动生成以下系统字段,无需手动赋值:
| 字段名 | 数据类型 | 含义 |
|---|---|---|
objectId |
String | 表的主键(唯一标识),由 Parse 自动生成(如 X7y8Z9a0B1c2D3e4) |
createdAt |
Date | 附件记录的创建时间(上传时间),自动生成 |
updatedAt |
Date | 附件记录的最后更新时间(如修改分类、更新 URL),自动更新 |
ACL |
Parse ACL | 附件的权限控制列表(默认继承 Parse 全局配置,可自定义读写权限) |
Attachment 表通过 Pointer 类型与其他核心表关联,形成业务数据链路:
_User 表:通过 user 字段关联,追溯附件的上传用户,支持“个人附件列表”“按用户筛选附件”等场景。Company 表:通过 company 字段关联,实现“公司级数据隔离”,确保不同公司用户仅能访问本公司的附件。Category 表:通过 category 字段关联,支持附件的分类管理(如“产品素材”“财务文档”),便于筛选与归类。file.url 是相对路径(非 HTTP 开头),自动拼接 domain 生成绝对 URL,避免前端无法访问。file.md5,但提供了原始文件 srcFile,则通过 calcFileMd5 函数动态计算 MD5,保证校验信息的可用性。company 字段优先取显式传入的 companyId,其次取当前实例的 cid、localStorage 缓存的 company 值,确保关联关系尽可能完整。