Skip to content
导航栏

文件处理

使用 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'); // 按模式匹配文件

约定

  1. 示例中约定应用根目录为 /data/app, 实际编写时需替换为应用根目录。
  2. 使用 <> 标识自行替换的内容。 例如: 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