开源一个离线版Alist,无需服务端部署即可管理云盘文件


Table of Contents

Alist 是一个非常不错的云盘文件管理程序,不过需要一台服务器或者 Nas 进行部署,当然,这也同样便于在网络分享文件。但如果只是个人使用,服务器部署以及多账户系统未免有些麻烦。我是一个怕麻烦的人,虽然我自己也在 Nas 中部署了一个 Alist 服务,但还是想要一个单独的 离线版APP红枫云盘 就由此诞生。

红枫云盘maple-file,名称由 maple(枫叶) + file(文件) 组成, 这原本是我很早之前写的一个基于 Flask 的项目,主要用于图片上传,还有相册的功能,但已经很久没有使用和维护过了。本来我准备把新项目起名为 Filesea,但又和我的另一个类似 Alist 的项目名相同(未开源),而且 Filesea 和一个知名项目 Seafile 过于相似,所以还是继续沿用之前的名称,毕竟对比之前的纯API也算得上是一个全新的升级和改版

功能

目前已经支持的存储:

  • local(本地文件)

  • smb

  • ftp

  • sftp

  • webdav

  • alist

  • 又拍云

包括了文件上传、下载、重命名、移动、复制、创建文件夹、预览等功能,虽然部分功能比如预览还比较简陋,但持续优化中,未来可能会添加相册,文件同步和备份等功能

  • 文件列表

  • 文件预览: 支持文本文件,图片,音频,视频

  • 上传和下载

  • 重命名、移动、复制(包括多选)

  • 添加修改存储

  • 设置

使用

目前提供了Android版本和MacOS版本的下载,下载地址: https://github.com/honmaple/maple-file/releases/tag/v1.0.0

开发

我参考了 GopeedPho 两个项目,客户端使用 Flutter,后端服务使用 Go,通过 gomobileGo 服务打包成 aar(安卓),或者利用 buildmode 打包成 .dylib(MacOS), 这样就能把服务端嵌入到本地客户端,来达到 serverless 的目的。

如果想要添加更多存储,只需要使用 Go 创建一个文件系统接口

type FS interface {
    WalkDir(context.Context, string, WalkDirFunc) error
    List(context.Context, string) ([]File, error)
    Move(context.Context, string, string) error
    Copy(context.Context, string, string) error
    Rename(context.Context, string, string) error
    Remove(context.Context, string) error
    MakeDir(context.Context, string) error
    Get(string) (File, error)
    Open(string) (FileReader, error)
    Create(string) (FileWriter, error)
    Close() error
}

然后注册一个新的存储名称

// 注册服务
func init() {
    driver.Register("alist", func() driver.Option {
        return &Option{}
    })
}


// 加载服务
import (
   _ "github.com/honmaple/maple-file/server/pkg/driver/alist"
)

最后在客户端创建一个用于提交配置的表单即可,扩展性足够简单,也足够方便

...
DriverFormField(
  label: "用户".tr(context),
  value: _option["username"],
  isRequired: true,
  onTap: (result) {
    setState(() {
      _option["username"] = result;
    });

    widget.form.option = jsonEncode(_option);
  },
),
DriverFormField(
  type: DriverFormFieldType.password,
  label: "密码".tr(context),
  value: _option["password"],
  onTap: (result) {
    setState(() {
      _option["password"] = result;
    });

    widget.form.option = jsonEncode(_option);
  },
),
作者: honmaple
链接: https://honmaple.me/articles/2024/12/kai-yuan-ge-chi-xian-ban-alist-wu-xu-fu-wu-duan-bu-shu-ji-ke-guan-li-yun-pan-wen-jian.html
版权: CC BY-NC-SA 4.0 知识共享署名-非商业性使用-相同方式共享4.0国际许可协议
wechat
alipay

加载评论