文件处理
使用 FS 对象实现文件操作。 Yao 提供 data, app 两个空间, data 用于应用数据操作, app 用于应用级别的文件操作
文件处理器列表
处理器 | 说明 | 参数 | 返回值 |
---|---|---|---|
fs.system.Upload | 上传文件到应用 data 目录 | file: 上传的文件对象 | 上传后的文件路径 |
fs.system.ReadFile | 读取文件内容 | file: 文件路径 | 文件内容(字符串) |
fs.system.ReadFileBuffer | 读取文件内容为二进制 | file: 文件路径 | 文件内容(二进制) |
fs.system.WriteFile | 写入文件内容 | file: 文件路径 content: 文件内容 perm: 权限(可选,默认 0644) | 写入的字节数 |
fs.system.WriteFileBuffer | 写入二进制内容 | file: 文件路径 content: 二进制内容 perm: 权限(可选,默认 0644) | 写入的字节数 |
fs.system.AppendFile | 追加文件内容 | file: 文件路径 content: 追加内容 perm: 权限(可选,默认 0644) | 写入的字节数 |
fs.system.AppendFileBuffer | 追加二进制内容 | file: 文件路径 content: 二进制内容 perm: 权限(可选,默认 0644) | 写入的字节数 |
fs.system.InsertFile | 在指定位置插入内容 | file: 文件路径 offset: 插入位置 content: 插入内容 perm: 权限(可选,默认 0644) | 写入的字节数 |
fs.system.InsertFileBuffer | 在指定位置插入二进制 | file: 文件路径 offset: 插入位置 content: 二进制内容 perm: 权限(可选,默认 0644) | 写入的字节数 |
fs.system.ReadDir | 读取目录内容 | dir: 目录路径 recursive: 是否递归(可选,默认 false) | 文件列表 |
fs.system.Mkdir | 创建目录 | dir: 目录路径 perm: 权限(可选,默认 0755) | 无 |
fs.system.MkdirAll | 递归创建目录 | dir: 目录路径 perm: 权限(可选,默认 0755) | 无 |
fs.system.MkdirTemp | 创建临时目录 | dir: 父目录(可选) pattern: 目录名模式(可选) | 临时目录路径 |
fs.system.Remove | 删除文件或空目录 | path: 路径 | 无 |
fs.system.RemoveAll | 递归删除目录 | path: 路径 | 无 |
fs.system.Exists | 检查文件是否存在 | path: 路径 | bool |
fs.system.IsDir | 检查是否为目录 | path: 路径 | bool |
fs.system.IsFile | 检查是否为文件 | path: 路径 | bool |
fs.system.IsLink | 检查是否为链接 | path: 路径 | bool |
fs.system.Chmod | 修改权限 | path: 路径 perm: 权限 | 无 |
fs.system.Size | 获取文件大小 | path: 路径 | 文件大小(字节) |
fs.system.Mode | 获取文件权限 | path: 路径 | 权限值 |
fs.system.ModTime | 获取修改时间 | path: 路径 | 时间戳 |
fs.system.BaseName | 获取文件名 | path: 路径 | 文件名 |
fs.system.DirName | 获取目录名 | path: 路径 | 目录名 |
fs.system.ExtName | 获取扩展名 | path: 路径 | 扩展名 |
fs.system.MimeType | 获取 MIME 类型 | path: 路径 | MIME 类型 |
fs.system.Move | 移动文件或目录 | src: 源路径 dst: 目标路径 | 无 |
fs.system.MoveAppend | 移动并追加内容 | src: 源路径 dst: 目标路径 | 无 |
fs.system.MoveInsert | 移动并插入内容 | src: 源路径 dst: 目标路径 offset: 插入位置 | 无 |
fs.system.Copy | 复制文件或目录 | src: 源路径 dst: 目标路径 | 无 |
fs.system.Download | 下载文件 | file: 文件路径 | |
fs.system.Zip | 压缩文件或目录 | src: 源路径 dst: 目标路径 | 无 |
fs.system.Unzip | 解压缩文件 | src: 源文件 dst: 目标目录 | 解压的文件列表 |
fs.system.Glob | 按模式匹配文件 | pattern: 匹配模式 | 匹配的文件列表 |
fs.system.Merge | 合并文件 | sourceFiles: 源文件列表 target: 目标文件 | 无 |
文件上传下载示例
文件上传
上传文件操作,上传文件名为 file 的文件,新建/apis/storage.http.json
代码如下:
json
{
"name": "存储接口",
"version": "1.0.0",
"description": "存储接口API",
"group": "storage",
"guard": "bearer-jwt",
"paths": [
{
"path": "/upload",
"method": "POST",
"guard": "-",
"process": "flows.upload",
"in": ["$file.file"],
"out": {
"status": 200,
"type": "application/json"
}
}
]
}
新建/flows/upload.flow.json
代码如下:
json
{
"label": "上传文件",
"version": "1.0.0",
"description": "上传文件",
"nodes": [
{
"name": "上传",
"process": "fs.system.Upload",
"args": ["{{$in.0}}"]
}
],
"output": "{{$res.上传}}"
}
文件下载
导出 Excel 操作,新建路由文件:/apis/utils.http.json
代码如下:
json
{
"name": "下载Excel",
"version": "1.0.0",
"description": "下载Excel",
"group": "utils",
"guard": "-",
"paths": [
{
"guard": "-",
"path": "/export/:name",
"method": "GET",
"process": "flows.utils.export",
"in": ["$param.name"],
"out": {
"status": 200,
"type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"headers": {
"Content-Disposition": "attachment;filename=导出数据.xlsx"
}
}
}
]
}
新建文件:/flows/utils/export.flow.json
代码如下:
json
{
"label": "下载",
"version": "1.0.0",
"description": "下载",
"nodes": [
{
"name": "文件",
"process": "xiang.table.Export",
"args": ["{{$in.0}}", {}, 20]
},
{
"name": "数据",
"process": "fs.system.ReadFile",
"args": ["{{$res.文件}}", false]
}
],
"output": "{{$res.数据.content}}"
}
假如有一个表格名字叫:/tables/pet.tab.json
,导出表格的列表数据只需要请求:/utils/export/pet
文件操作示例
基础文件操作
javascript
// 创建文件系统对象
var fs = new FS('data'); // 操作应用数据目录
var fs_app = new FS('app'); // 操作应用目录
// 读写文件
var content = fs.ReadFile('/test.txt'); // 读取文件内容
var length = fs.WriteFile('/test.txt', 'Hello World', 0644); // 写入文件
var length = fs.AppendFile('/test.txt', '\nNew Line'); // 追加内容
// 二进制文件操作
var buffer = fs.ReadFileBuffer('/image.png'); // 读取二进制
var length = fs.WriteFileBuffer('/copy.png', buffer); // 写入二进制
// 文件属性
var exists = fs.Exists('/test.txt'); // 检查文件是否存在
var size = fs.Size('/test.txt'); // 获取文件大小
var time = fs.ModTime('/test.txt'); // 获取修改时间
var mime = fs.MimeType('/test.txt'); // 获取MIME类型
// 文件路径操作
var name = fs.BaseName('/path/to/file.txt'); // 获取文件名: file.txt
var dir = fs.DirName('/path/to/file.txt'); // 获取目录名: /path/to
var ext = fs.ExtName('/path/to/file.txt'); // 获取扩展名: .txt
目录操作
javascript
// 创建和删除目录
fs.Mkdir('/newdir'); // 创建目录
fs.MkdirAll('/path/to/newdir'); // 递归创建目录
fs.Remove('/emptydir'); // 删除空目录
fs.RemoveAll('/dir'); // 递归删除目录
// 临时目录
var tempDir = fs.MkdirTemp(); // 创建临时目录
var tempDir = fs.MkdirTemp('/base', 'prefix-*'); // 在指定目录创建临时目录
// 读取目录
var files = fs.ReadDir('/path'); // 读取目录内容
var allFiles = fs.ReadDir('/path', true); // 递归读取目录
// 目录属性
var isDir = fs.IsDir('/path'); // 检查是否为目录
var mode = fs.Mode('/path'); // 获取目录权限
文件移动和复制
javascript
// 移动文件
fs.Move('/source.txt', '/dest.txt'); // 移动文件
fs.MoveAppend('/source.txt', '/dest.txt'); // 移动并追加到目标
fs.MoveInsert('/source.txt', '/dest.txt', 100); // 移动并在指定位置插入
// 复制文件
fs.Copy('/source.txt', '/dest.txt'); // 复制文件
fs.Copy('/sourcedir', '/destdir'); // 复制目录
压缩和解压
javascript
// 压缩文件和目录
fs.Zip('/source', '/archive.zip'); // 压缩文件或目录
fs.Unzip('/archive.zip', '/extract'); // 解压文件
// 文件合并
fs.Merge(['file1.txt', 'file2.txt'], 'merged.txt'); // 合并多个文件
// 文件匹配
var matches = fs.Glob('*.txt'); // 按模式匹配文件
约定
- 示例中约定应用根目录为
/data/app
, 实际编写时需替换为应用根目录。 - 使用
<>
标识自行替换的内容。 例如:icon-<图标名称>
, 实际编写时应替换为:icon-foo
,icon-bar
...
空间 | 根目录 | 说明 |
---|---|---|
data | /data/app/data | 应用数据 |
app | /data/app | 应用目录 |
源码: https://github.com/YaoApp/gou/blob/main/runtime/v8/objects/fs/fs.go