Skip to content

一款手机端云存储平台/图床管理和文件上传/下载工具,支持直接管理Webdav,Alist,SSH/SFTP,云服务器,兼容S3 API的平台,腾讯COS,阿里OSS,七牛云,又拍云,兰空图床,Imgur,SM.MS和github

License

Notifications You must be signed in to change notification settings

Kuingsmile/PicHoro

Repository files navigation

PicHoro Logo

PicHoro

Release Version

简介

PicHoro 是一款基于 Flutter 的手机端云存储平台/图床管理和文件上传/下载工具,最新版本 V2.4.0

  • 与 PicGo/PicList 配置互通,可直接扫码导入
  • 支持云存储/图床/云服务器平台和网盘管理(通过 Alist
  • 提供文件上传、下载管理及多格式链接分享功能

支持多种图片/PDF/文本文件/音视频的在线预览和播放,具体支持的格式请查看支持的格式列表

桌面端推荐:如果您需要桌面端图床管理,推荐使用 PicList

📘 项目介绍和配置手册

支持的图床/存储平台

  • 兰空图床V2
  • SM.MS
  • Github
  • Imgur
  • 七牛云存储
  • 腾讯云COS V5
  • 阿里云OSS
  • 又拍云存储
  • FTP-SSH/SFTP
  • 兼容S3 API接口的平台
  • Alist V3
  • WebDav

特色功能

核心特性

  • 云存储/图床管理 - 新建/删除/修改存储桶,创建/删除目录和文件,上传和下载文件和照片等
  • 网盘管理 - 通过 Alist V3 或 WebDav 管理多种网盘
  • 图片压缩 - 支持压缩为 webp/jpg/png 格式
  • 多格式文件预览 - 包括图片/PDF/文本文件/音视频等
  • SSH/SFTP支持 - 可视化管理文件,内置 SSH 终端可直接管理云服务器
  • PicGo兼容性 - 支持扫描二维码将 PicGo(v2.3.0-beta.2 以上版本)配置文件直接导入 PicHoro

其他功能

  • 每种图床最多支持 26 个备用配置,可快速切换
  • 连续上传模式,相机拍照后自动上传并返回拍照页面
  • 支持导入剪贴板中的网络图片链接,换行符分割可批量导入
  • 上传图片后自动复制链接到剪贴板
  • 自定义复制到剪贴板的链接格式,占位符与 PicGo 一致
  • 多种文件重命名方式(时间戳、随机字符串和自定义重命名)
  • 相册分图床显示,支持多选管理,复制多张图片链接或删除
  • 支持导出配置至剪贴板(与 PicGo 配置文件格式相同)
  • 查看和导出软件日志,快捷查找问题和报告 bug

文件预览支持

平台 图片 PDF 文本文件 视频
Alist
阿里云
S3
腾讯云
又拍云
七牛云
WebDav
FTP
Github
Imgur
兰空
SM.MS

下载

安卓

iOS

目前暂无 iOS 版本。如果您有兴趣帮助开发 iOS 版本,请联系我们提供技术支持。

应用展示

7ddc751ff2b354b4e9ab7729946ec7aa.mp4
主页面 相册页面 文件管理
设置页面 图床配置 文件上传
预览功能 自定义链接 文件管理
上传历史 SSH终端 配置导出

最近更新

详细更新日志请查看更新日志

2024-07-19 V2.4.0

新增功能:

  • 与 AList 3.35 版本保持同步
  • alist 图床现在支持设置管理员 token
  • sm.ms 图床上传重复图片时不再判定为失败
  • S3 兼容平台支持带端口号的 endpoint
  • S3 兼容平台支持设置是否启用 SSL 连接和 S3 path style
  • 优化图床导入,支持 PicList 内置 AList、兰空图床、ftp 图床、WebDAV 图床及 alist 图床插件配置
  • 优化文件 mime 类型判断,兼容更多文件类型并默认使用 application/octet-stream
  • 重命名占位符 {m}{d} 固定为两位数字,如 0102
  • 新增重命名占位符: {h}(小时)、{i}(分钟)、{s}(秒)、{ms}(毫秒)、{str-num}
  • 默认自定义重命名格式修改为 {Y}{m}{d}{h}{i}{ms},与 PicGo 一致
  • 默认自定义链接格式修改为 ![$fileName]($url)
  • 设置图床配置时自动去除开头和结尾多余空格

修复问题:

  • alist 备用设置中无法设置网址路径的问题
  • alist 设置了网址路径时返回地址多了一个 '/' 的问题
  • alist 返回链接是平台直链而非 alist 专用网址的问题
  • 特定情况下 ftp 图床返回链接错误的问题
  • ftp 图床设置页面打开错误的问题
  • 导入 imgur 配置时错误保存到 smms 的问题
  • 关闭自动复制链接后仍然会复制到剪贴板的问题

开发与交流

Telegram 交流群:

Telegram Group

开发说明

依赖项目

克隆本项目后,请同时克隆以下项目到同级目录:

git clone https://github.com/Kuingsmile/flutterdep

软件修改步骤

  1. 准备环境: 安装 Android Studio、Android SDK 21+ 和 Flutter 3.13
  2. 克隆仓库: git clone https://github.com/Kuingsmile/PicHoro.git
  3. Windows 用户推荐使用 VSCode 编辑和调试代码

图床修改说明

兰空图床相册 ID 参数生效条件:

  1. 基于付费企业版兰空图床搭建
  2. 开源免费版需修改源代码文件 /app/Services/ImageService.php:
// 原代码
if ($albumId = $user->configs->get(UserConfigKey::DefaultAlbum)) {
    if ($user->albums()->where('id', $albumId)->exists()) {
        $image->album_id = $albumId;
    }
}

// 修改后
if ($request->has('album_id')) {
    $image->album_id = $request->input('album_id');
} else {
    if ($albumId = $user->configs->get(UserConfigKey::DefaultAlbum)) {
        if ($user->albums()->where('id', $albumId)->exists()) {
            $image->album_id = $albumId;
        }
    }
}

依赖包修改

本 APP 使用的部分依赖包需要手动修改:

1. minio_new

包含在 https://github.com/Kuingsmile/flutterdep 中,无需手动修改。

  1. queries['maxKeys']修改为 queries['max-keys']
  2. 添加导入 import 'package:xml2json/xml2json.dart';
  3. 如下修改 listBuckets函数
  Future<List<Bucket>> listBuckets() async {
    final resp = await _client.request(
      method: 'GET',
      region: region ?? 'us-east-1',
    );
    final myTransformer = Xml2Json();
    myTransformer.parse(resp.body);
    Map responseMap = json.decode(myTransformer.toParker());
    List<Bucket> buckets = [];
    if (responseMap['ListAllMyBucketsResult'] == null ||
        responseMap['ListAllMyBucketsResult']['Buckets'] == null ||
        responseMap['ListAllMyBucketsResult']['Buckets']['Bucket'] == null ||
        responseMap['ListAllMyBucketsResult']['Buckets']['Bucket'].length ==
            0) {
      return buckets;
    }
    if (responseMap['ListAllMyBucketsResult']['Buckets']['Bucket'] is! List) {
      buckets.add(Bucket(
          DateTime.parse(responseMap['ListAllMyBucketsResult']['Buckets']
              ['Bucket']['CreationDate']),
          responseMap['ListAllMyBucketsResult']['Buckets']['Bucket']['Name']));
      return buckets;
    }
    for (var bucket in responseMap['ListAllMyBucketsResult']['Buckets']
        ['Bucket']) {
      buckets
          .add(Bucket(DateTime.parse(bucket['CreationDate']), bucket['Name']));
    }
    return buckets;
  }

2. chewie

文件路径示例: "D:\flutter\.pub-cache\hosted\pub.flutter-io.cn\chewie-1.3.6\lib\src\player_with_controls.dart"

修改第 86 行:

return Container(
    color:Colors.black,
    child:Center(
    child: SizedBox(
      height: MediaQuery.of(context).size.height,
      width: MediaQuery.of(context).size.width,
      child: AspectRatio(
        aspectRatio: calculateAspectRatio(context),
        child: buildPlayerWithControls(chewieController, context),
      ),
    )),
  );

软件打包

使用以下命令构建:

flutter build apk --release

构建成功后,在 build\app\outputs\flutter-apk\release 生成 app-release.apk 文件。

注意: 请设置 minifyEnabled falseshrinkResources false,否则打包后可能闪退。

License

MIT

Copyright (c) 2022-present, Kuingsmile

Github Star 趋势

Stargazers over time

About

一款手机端云存储平台/图床管理和文件上传/下载工具,支持直接管理Webdav,Alist,SSH/SFTP,云服务器,兼容S3 API的平台,腾讯COS,阿里OSS,七牛云,又拍云,兰空图床,Imgur,SM.MS和github

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages