{"id":13454641,"url":"https://github.com/Kuingsmile/PicHoro","last_synced_at":"2025-03-24T06:31:21.841Z","repository":{"id":60719804,"uuid":"544369464","full_name":"Kuingsmile/PicHoro","owner":"Kuingsmile","description":"一款手机端云存储平台/图床管理和文件上传/下载工具，支持直接管理Webdav，Alist，SSH/SFTP，云服务器，兼容S3 API的平台，腾讯COS，阿里OSS，七牛云，又拍云，兰空图床，Imgur，SM.MS和github","archived":false,"fork":false,"pushed_at":"2025-03-18T09:33:12.000Z","size":47849,"stargazers_count":818,"open_issues_count":2,"forks_count":40,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-03-18T10:35:03.752Z","etag":null,"topics":["alist","aliyun-oss","android","flutter","github","imgur","lsky-pro","picgo","qiniu","sftp","smms","ssh","tencent-cos","upyun","webdav"],"latest_commit_sha":null,"homepage":"https://pichoro.horosama.com","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Kuingsmile.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":"supported_format.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-10-02T09:57:06.000Z","updated_at":"2025-03-18T09:33:17.000Z","dependencies_parsed_at":"2024-01-24T16:48:47.817Z","dependency_job_id":"6e808274-e8f3-4a35-8ad9-d19715ea47b1","html_url":"https://github.com/Kuingsmile/PicHoro","commit_stats":null,"previous_names":[],"tags_count":47,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kuingsmile%2FPicHoro","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kuingsmile%2FPicHoro/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kuingsmile%2FPicHoro/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kuingsmile%2FPicHoro/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Kuingsmile","download_url":"https://codeload.github.com/Kuingsmile/PicHoro/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245222510,"owners_count":20580176,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alist","aliyun-oss","android","flutter","github","imgur","lsky-pro","picgo","qiniu","sftp","smms","ssh","tencent-cos","upyun","webdav"],"created_at":"2024-07-31T08:00:56.275Z","updated_at":"2025-03-24T06:31:16.826Z","avatar_url":"https://github.com/Kuingsmile.png","language":"Dart","funding_links":[],"categories":["Dart",":star: Apps supports PicGo Configuration"],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\r\n  \u003cimg src=\"http://imgx.horosama.com/admin_uploads/2022/10/2022_10_05_633d79e401694.png\" alt=\"\"\u003e\r\n  \u003ch1\u003ePicHoro\u003c/h1\u003e\r\n  \u003ca href=\"https://github.com/Kuingsmile/PicHoro/releases/latest\"\u003e\r\n    \u003cimg src=\"https://img.shields.io/github/release/Kuingsmile/PicHoro.svg?style=flat-square\" alt=\"\"\u003e\r\n  \u003c/a\u003e\r\n\u003c/div\u003e\r\n\r\n\u0026emsp;\u0026emsp;一款基于flutter的手机端云存储平台/图床管理和文件上传/下载工具，最新版本**V2.4.0**，与PicGo配置互通，可直接扫码导入，主要功能包括云存储/图床/云服务器平台,以及网盘管理（通过[Alist](https://alist.nn.ci/zh/))，文件上传和下载管理，以及各种格式的链接分享。\r\n\r\n\u0026emsp;\u0026emsp;支持多种图片/PDF/文本文件/音视频的在线预览和播放，具体支持的格式请查看[支持的格式列表](https://github.com/Kuingsmile/PicHoro/blob/main/supported_format.md \"支持的格式列表\")\r\n\r\n桌面端如果也希望进行图床管理，推荐使用我的另一个项目 `PicList`，[https://github.com/Kuingsmile/PicList](https://github.com/Kuingsmile/PicList)\r\n\r\n\u0026emsp;\u0026emsp;项目介绍和配置手册网址:\r\n\r\n\u0026emsp;\u0026emsp;[https://pichoro.horosama.com](https://pichoro.horosama.com)\r\n\r\n\u0026emsp;\u0026emsp;目前已支持如下图床：\r\n\r\n- [X] 兰空图床V2 (上传/相册-**V1.00**，文件管理-**V1.87**)\r\n- [X] SM.MS (上传/相册-**V1.41**，文件管理-**V1.81**)\r\n- [X] Github (上传/相册-**V1.55**，文件管理-**V1.89**)\r\n- [X] Imgur (上传/相册-**V1.60**，文件管理-**V1.90**)\r\n- [X] 七牛云存储 (上传/相册-**V1.65**，文件管理-**V1.86**)\r\n- [X] 腾讯云COS V5 (上传/相册-**V1.70**，文件管理-**V1.80**)\r\n- [X] 阿里云OSS (上传/相册-**V1.75**，文件管理-**V1.84**)\r\n- [X] 又拍云存储 (上传/相册-**V1.75**，文件管理-**V1.85**)\r\n- [X] FTP-SSH/SFTP (上传/相册-**V1.90**，文件管理-**V1.90**)\r\n- [X] 兼容S3 API接口的平台 (上传/相册-**V1.91**，文件管理-**V1.91**)\r\n- [X] Alist V3 (上传/相册-**V1.96**，文件管理-**V1.96**)\r\n- [X] WebDav (上传/相册-**V1.97**，文件管理-**V1.97**)\r\n\r\n## 特色功能\r\n\r\n- **支持直接管理云存储/图床，包括新建/删除/修改存储桶，创建/删除目录和文件，上传和下载文件和照片等**\r\n- **可通过Alist V3或WebDav管理多种网盘**\r\n- **支持图片压缩功能，可压缩为webp/jpg/png格式**\r\n- **支持预览多种格式的文件，包括图片/PDF/文本文件/音视频等**\r\n- **支持SSH/SFTP，可视化管理文件，内置SSH终端可直接管理云服务器**\r\n- **支持扫描二维码将PicGo(v2.3.0-beta.2以上版本)配置文件直接导入PicHoro**\r\n- 每种图床支持保存最多26个备用配置，可快速切换备用配置为主配置\r\n- 连续上传模式，相机拍照后自动上传然后返回拍照页面，可连续拍照上传\r\n- 可导入剪贴板中的网络图片链接，同时使用换行符分割多个链接可批量导入\r\n- 上传图片后自动复制链接到剪贴板，多图上传时全部复制\r\n- 支持自定义复制到剪贴板的链接格式，占位符与Picgo一致\r\n- 上传时可对文件重命名，目前有时间戳，随机字符串和自定义重命名三种方式，自定义重命名可使用多种占位符，如uuid，时间戳，md5等\r\n- 相册分图床显示，支持多选管理，复制多张图片链接或删除\r\n- 支持将PicHoro的配置导出至剪贴板，导出格式与PicGo配置文件相同，可直接导入PicGo\r\n- 可查看和导出软件日志，快捷查找问题和报告bug\r\n\r\n## 文件预览支持\r\n\r\n| 平台   | 图片  |  PDF  | 文本文件 | 视频  |\r\n| ------ | :---: | :---: | :------: | :---: |\r\n| Alist  |   ✅   |   ✅   |    ✅     |   ✅   |\r\n| 阿里云 |   ✅   |   ✅   |    ✅     |   ✅   |\r\n| S3     |   ✅   |   ✅   |    ✅     |   ✅   |\r\n| 腾讯云 |   ✅   |   ✅   |    ✅     |   ✅   |\r\n| 又拍云 |   ✅   |   ✅   |    ✅     |   ✅   |\r\n| 七牛云 |   ✅   |   ✅   |    ✅     |   ✅   |\r\n| WebDav |   ✅   |   ✅   |    ✅     |   ✅   |\r\n| FTP    |   ✅   |   ❌   |    ✅     |   ❌   |\r\n| Github |   ✅   |   ❌   |    ✅     |   ❌   |\r\n| Imgur  |   ✅   |   ❌   |    ❌     |   ✅   |\r\n| 兰空   |   ✅   |   ❌   |    ❌     |   ❌   |\r\n| SM.MS  |   ✅   |   ❌   |    ❌     |   ❌   |\r\n\r\n## 下载\r\n\r\n### 安卓\r\n\r\nGithub下载地址 [Github release](https://github.com/Kuingsmile/PicHoro/releases)\r\n\r\n我的个人网站提供的最新版本下载地址 [https://pichoro.msq.pub/PicHoro_V2.4.0.apk](https://pichoro.msq.pub/PicHoro_V2.4.0.apk)\r\n\r\n### IOS\r\n\r\n由于个人没有Mac，无法提供IOS版本，如果有人愿意帮忙开发IOS版本，可以联系我，我会提供相关的技术支持。\r\n\r\n## 应用截图\r\n\r\n\u003cdiv\u003e\u003cvideo controls src=\"https://user-images.githubusercontent.com/96409857/205264099-a3a5d040-df75-4ae2-9773-f4d61fe3fb0a.mp4\" muted=\"false\"\u003e\u003c/video\u003e\u003c/div\u003e\r\n\r\n\u003ctable rules=\"none\"\u003e\r\n  \u003ctr\u003e\r\n    \u003ctd\u003e\u003cimg src=\"https://user-images.githubusercontent.com/96409857/203718727-ceac86b4-8cb5-49c5-8ee3-bcfce51710cb.jpg\" width=\"200\" height=\"400\" alt=\"\"/\u003e\u003c/td\u003e\r\n    \u003ctd\u003e\u003cimg src=\"https://user-images.githubusercontent.com/96409857/203718378-fd4cf22f-b801-4356-9a8b-9d51a0db0e54.jpg\" width=\"200\" height=\"400\" alt=\"\"/\u003e\u003c/td\u003e\r\n    \u003ctd\u003e\u003cimg src=\"https://user-images.githubusercontent.com/96409857/211286619-63e406aa-0736-4581-bd9e-adde92209dba.png\" width=\"200\" height=\"400\" alt=\"\"/\u003e\u003c/td\u003e\r\n  \u003c/tr\u003e\r\n   \u003ctr\u003e\r\n    \u003ctd\u003e\u003cimg src=\"https://user-images.githubusercontent.com/96409857/211286730-2e0c05b3-5093-4738-8378-7d2c273a694b.png\" width=\"200\" height=\"400\" alt=\"\"/\u003e\u003c/td\u003e\r\n    \u003ctd\u003e\u003cimg src=\"https://user-images.githubusercontent.com/96409857/203719066-b6e45be8-eb8f-49da-bea2-78f3d4379591.jpg\" width=\"200\" height=\"400\" alt=\"\"/\u003e\u003c/td\u003e\r\n    \u003ctd\u003e\u003cimg src=\"https://user-images.githubusercontent.com/96409857/203719617-b54a49bb-d9f9-4917-a68a-b4a46f951ee0.png\" width=\"200\" height=\"400\" alt=\"\"/\u003e\u003c/td\u003e\r\n  \u003c/tr\u003e\r\n   \u003ctr\u003e\r\n    \u003ctd\u003e\u003cimg src=\"https://user-images.githubusercontent.com/96409857/203719608-34170e4c-2d6f-4e3a-990a-f61c610417e9.png\" width=\"200\" height=\"400\" alt=\"\"/\u003e\u003c/td\u003e\r\n    \u003ctd\u003e\u003cimg src=\"https://user-images.githubusercontent.com/96409857/203720199-38266fae-e0fa-4aad-8315-f272bc8b6add.jpg\" width=\"200\" height=\"400\" alt=\"\"/\u003e\u003c/td\u003e\r\n    \u003ctd\u003e\u003cimg src=\"https://user-images.githubusercontent.com/96409857/203720359-26717390-1789-4750-97dd-27836da322da.jpg\" width=\"200\" height=\"400\" alt=\"\"/\u003e\u003c/td\u003e\r\n  \u003c/tr\u003e\r\n  \u003ctr\u003e\r\n    \u003ctd\u003e\u003cimg src=\"https://user-images.githubusercontent.com/96409857/203720473-577368a7-ed29-461b-b8f2-4077dd02ca84.jpg\" width=\"200\" height=\"400\" alt=\"\"/\u003e\u003c/td\u003e\r\n    \u003ctd\u003e\u003cimg src=\"https://user-images.githubusercontent.com/96409857/203720565-4d4008a5-198f-451d-b0cc-b1780291f2b7.png\" width=\"200\" height=\"400\" alt=\"\"/\u003e\u003c/td\u003e\r\n    \u003ctd\u003e\u003cimg src=\"https://user-images.githubusercontent.com/96409857/203720614-4bfd6e0c-ea16-4ed1-945d-c5c5524c89a6.png\" width=\"200\" height=\"400\" alt=\"\"/\u003e\u003c/td\u003e\r\n  \u003c/tr\u003e\r\n\u003c/table\u003e\r\n\r\n## 最近更新\r\n\r\n  详细更新日志请查看[更新日志](https://github.com/Kuingsmile/PicHoro/blob/main/Version_update_log.md \"更新日志\")\r\n\r\n## 2024-07-19 **V2.4.0**\r\n\r\n- 新增：与AList 3.35版本保持同步\r\n- 新增：`alist`图床现在支持设置管理员token\r\n- 新增：`sm.ms`图床上传重复图片时，后上传的图片现在不会判定为失败\r\n- 新增：S3兼容平台现在支持带端口号的endpoint\r\n- 新增：S3兼容平台现在支持设置是否启用SSL连接和S3 path style\r\n- 新增：优化了图床导入，现在支持导入PicList内置AList、兰空图床、ftp图床、WebDAV图床，以及alist图床插件配置\r\n- 新增：优化了对文件mime类型的判断，现在兼容更多文件类型同时默认使用`application/octet-stream`\r\n- 新增：现在重命名占位符`{m}`和`{d}`固定为两位数字，如`01`,`02`\r\n- 新增：现在重命名占位符支持`{h}`(小时),`{i}`(分钟),`{s}`(秒),`{ms}`(毫秒),`{str-num}`,其中num为任意数字\r\n- 新增：默认自定义重命名格式修改为`{Y}{m}{d}{h}{i}{ms}`，与PicGo时间戳重命名格式一致\r\n- 新增：默认自定义链接格式修改为`![$fileName]($url)`\r\n- 新增：设置图床配置时现在会自动去除开头和结尾多余的空格\r\n\r\n- 修复：alist备用设置中无法设置网址路径的问题\r\n- 修复：alist设置了网址路径时返回的地址多了一个'/'的问题\r\n- 修复：alist返回的链接是平台直链而不是alist专用网址的问题\r\n- 修复：特定情况下`ftp`图床返回链接错误的问题\r\n- 修复：ftp图床设置页面打开错误的问题\r\n- 修复：导入`imgur`配置时错误保存到`smms`的问题\r\n- 修复：关闭自动复制链接后仍然会复制到剪贴板的问题\r\n\r\n## 2024-04-13 **V2.3.0**\r\n\r\n- 新增：优化了smms图床的配置检查速度\r\n- 新增：阿里云新增了对`oss-cn-wuhan`地域的支持\r\n- 新增：现在允许s3图床桶名含有大写字母\r\n- 修复：修复了github图床自定义域名以多个`/`结尾时，返回路径错误的问题\r\n- 修复：修复了图片链接格式设置为BBcode时上传报错的问题\r\n\r\n## 开发交流\r\n\r\n开发进度可以查看 [Projects](https://github.com/Kuingsmile/PicHoro/projects)，会同步更新开发进度。\r\n\r\n欢迎加入 [Github讨论区](https://github.com/Kuingsmile/PicHoro/discussions) 与我交流。\r\n\r\n遇到Bug或有好的建议可以在 [Github Issues](https://github.com/Kuingsmile/PicHoro/issues) 中提出。\r\n\r\nTelegram交流群：\r\n\r\n![wechat](https://pichoro.msq.pub/wechat.png)\r\n\r\n## 开发说明\r\n\r\n### 依赖项目\r\n\r\n请在clone本项目后，将以下项目clone到本地，放在同级目录下，否则无法正常运行。\r\n\r\n`https://github.com/Kuingsmile/flutterdep`\r\n\r\n### 软件修改\r\n\r\n如果你想要修改或自行构建 PicHoro，可以依照下面的指示：\r\n\r\n1. 你需要有 Android Studio和 Android SDK 21+ 的环境，并安装了Flutter 3.13版本。flutter环境配置可以参考 [Flutter 官方文档](https://flutter.dev/docs/get-started/install)。\r\n2. `git clone https://github.com/Kuingsmile/PicHoro.git` 并进入项目。\r\n3. Windows 推荐使用VScode编辑和调试代码。\r\n\r\n### 图床修改\r\n\r\n兰空图床的相册ID参数，限于以下两种情况下才会生效：\r\n    1. 基于付费企业版兰空图床搭建\r\n    2. 开源免费版需要自己或者联系管理员修改源代码文件，修改方式为打开 **/app/Services/ImageService.php**文件，修改第139行，原文件为\r\n\r\n```php\r\n            if ($albumId = $user-\u003econfigs-\u003eget(UserConfigKey::DefaultAlbum)) {\r\n                if ($user-\u003ealbums()-\u003ewhere('id', $albumId)-\u003eexists()) {\r\n                    $image-\u003ealbum_id = $albumId;\r\n                }\r\n            }\r\n```\r\n\r\n修改为\r\n\r\n```php\r\n           if ($request-\u003ehas('album_id')) {\r\n                $image-\u003ealbum_id = $request-\u003einput('album_id');\r\n            } else {\r\n            if ($albumId = $user-\u003econfigs-\u003eget(UserConfigKey::DefaultAlbum)) {\r\n                if ($user-\u003ealbums()-\u003ewhere('id', $albumId)-\u003eexists()) {\r\n                    $image-\u003ealbum_id = $albumId;\r\n                }\r\n            }\r\n        }\r\n```\r\n\r\n### 依赖包修改\r\n\r\n本APP使用的部分依赖包需要手动修改源代码才可使用，需要修改的依赖包如下：\r\n\r\n#### minio_new\r\n\r\n该依赖已经包含在了 `https://github.com/Kuingsmile/flutterdep`中，无需手动修改。\r\n\r\n1. `queries['maxKeys']`修改为 `queries['max-keys']`\r\n2. 添加导入 `import 'package:xml2json/xml2json.dart';`\r\n3. 如下修改 `listBuckets`函数\r\n\r\n```dart\r\n  Future\u003cList\u003cBucket\u003e\u003e listBuckets() async {\r\n    final resp = await _client.request(\r\n      method: 'GET',\r\n      region: region ?? 'us-east-1',\r\n    );\r\n    final myTransformer = Xml2Json();\r\n    myTransformer.parse(resp.body);\r\n    Map responseMap = json.decode(myTransformer.toParker());\r\n    List\u003cBucket\u003e buckets = [];\r\n    if (responseMap['ListAllMyBucketsResult'] == null ||\r\n        responseMap['ListAllMyBucketsResult']['Buckets'] == null ||\r\n        responseMap['ListAllMyBucketsResult']['Buckets']['Bucket'] == null ||\r\n        responseMap['ListAllMyBucketsResult']['Buckets']['Bucket'].length ==\r\n            0) {\r\n      return buckets;\r\n    }\r\n    if (responseMap['ListAllMyBucketsResult']['Buckets']['Bucket'] is! List) {\r\n      buckets.add(Bucket(\r\n          DateTime.parse(responseMap['ListAllMyBucketsResult']['Buckets']\r\n              ['Bucket']['CreationDate']),\r\n          responseMap['ListAllMyBucketsResult']['Buckets']['Bucket']['Name']));\r\n      return buckets;\r\n    }\r\n    for (var bucket in responseMap['ListAllMyBucketsResult']['Buckets']\r\n        ['Bucket']) {\r\n      buckets\r\n          .add(Bucket(DateTime.parse(bucket['CreationDate']), bucket['Name']));\r\n    }\r\n    return buckets;\r\n  }\r\n```\r\n\r\n#### chewie\r\n\r\n文件路径示例: `\"D:\\flutter\\.pub-cache\\hosted\\pub.flutter-io.cn\\chewie-1.3.6\\lib\\src\\player_with_controls.dart\"`\r\n\r\n第86行开始修改为\r\n\r\n```dart\r\n  return Container(\r\n      color:Colors.black,\r\n      child:Center(\r\n      child: SizedBox(\r\n        height: MediaQuery.of(context).size.height,\r\n        width: MediaQuery.of(context).size.width,\r\n        child: AspectRatio(\r\n          aspectRatio: calculateAspectRatio(context),\r\n          child: buildPlayerWithControls(chewieController, context),\r\n        ),\r\n      )),\r\n    );\r\n```\r\n\r\n### 软件打包\r\n\r\n如果你需要自行构建，可以使用 `flutter build apk --release`命令构建。\r\n构建成功后，会在 `build\\app\\outputs\\flutter-apk\\release` 目录下生成 `app-release.apk` 文件。\r\n\r\n请设置 `minifyEnabled false`和 `shrinkResources false`，否则打包release版本后可能会出现闪退。\r\n\r\n## License\r\n\r\n[MIT](https://opensource.org/licenses/MIT)\r\n\r\nCopyright (c) 2022-present, Kuingsmile\r\n\r\n## Github star\r\n\r\n[![Stargazers over time](https://starchart.cc/Kuingsmile/PicHoro.svg)](https://starchart.cc/Kuingsmile/PicHoro)\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKuingsmile%2FPicHoro","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FKuingsmile%2FPicHoro","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKuingsmile%2FPicHoro/lists"}