Files
tfm-oss/README.md
T
2025-11-26 05:27:09 +00:00

279 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Tiny File Manager - 阿里云 OSS 版本
基于 Tiny File Manager v2.6 改造的阿里云 OSS 对象存储版本,支持通过 Web 界面管理 OSS 文件。
## 🌟 主要特性
-**插件式集成**:在原版基础上添加 OSS 支持,保留本地文件系统功能
-**一键切换**:通过配置开关在本地模式和 OSS 模式间切换
-**完整功能**:支持浏览、上传、下载、创建、编辑、重命名、复制、删除等所有操作
-**自定义域名**:支持使用绑定到 Bucket 的自定义域名
-**内网优化**:ECS 内网访问自动使用内网 endpoint,节省流量费用
-**批量操作**:优化的文件夹重命名和删除,支持大量文件处理
## 📋 系统要求
- PHP >= 7.2
- Composer(用于安装 OSS SDK
- 阿里云 OSS 账号和 Bucket
## 🚀 快速开始
### 1. 安装依赖
使用提供的安装脚本自动安装 Composer 和 OSS SDK
```bash
bash install_oss.sh
```
或手动安装:
```bash
# 安装 Composer(如果未安装)
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
# 安装阿里云 OSS SDK
composer require aliyuncs/oss-sdk-php
```
### 2. 配置 OSS
编辑 `myfile.php` 文件(约第 20-37 行),修改 OSS 配置:
```php
// ========== 阿里云 OSS 配置 (插件式集成) ==========
$use_aliyun_oss = true; // 启用 OSS 模式(设为 false 则使用本地文件系统)
$oss_config = array(
'access_key_id' => 'YOUR_ACCESS_KEY_ID', // 阿里云 AccessKey ID
'access_key_secret' => 'YOUR_ACCESS_KEY_SECRET', // 阿里云 AccessKey Secret
'endpoint' => 'oss-cn-hangzhou.aliyuncs.com', // OSS endpoint(根据你的地域修改)
'bucket' => 'your-bucket-name', // OSS Bucket 名称
'use_internal' => false, // 是否使用内网 endpointECS 内网访问设为 true
'use_ssl' => true, // 是否使用 HTTPS
'prefix' => '', // OSS 对象前缀(可选,如 'uploads/'
'custom_domain' => 'https://your-domain.com', // 自定义域名(可选)
);
```
### 3. 访问管理界面
在浏览器中访问:`http://your-domain.com/myfile.php`
默认用户名和密码:
- 用户名:`admin`
- 密码:`admin@123`
⚠️ **安全提示**:首次登录后请立即修改默认密码!
## ⚙️ 配置说明
### OSS 配置项详解
| 配置项 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `access_key_id` | string | ✅ | 阿里云 AccessKey ID |
| `access_key_secret` | string | ✅ | 阿里云 AccessKey Secret |
| `endpoint` | string | ✅ | OSS endpoint,如 `oss-cn-hangzhou.aliyuncs.com` |
| `bucket` | string | ✅ | OSS Bucket 名称 |
| `use_internal` | boolean | ❌ | 是否使用内网 endpointECS 建议开启) |
| `use_ssl` | boolean | ❌ | 是否使用 HTTPS(默认 true |
| `prefix` | string | ❌ | 对象前缀,用于隔离不同应用的文件 |
| `custom_domain` | string | ❌ | 自定义域名(需先在 OSS 绑定) |
### Endpoint 地域列表
| 地域 | 公网 Endpoint | 内网 Endpoint |
|------|--------------|---------------|
| 华东1(杭州) | oss-cn-hangzhou.aliyuncs.com | oss-cn-hangzhou-internal.aliyuncs.com |
| 华东2(上海) | oss-cn-shanghai.aliyuncs.com | oss-cn-shanghai-internal.aliyuncs.com |
| 华北2(北京) | oss-cn-beijing.aliyuncs.com | oss-cn-beijing-internal.aliyuncs.com |
| 华南1(深圳) | oss-cn-shenzhen.aliyuncs.com | oss-cn-shenzhen-internal.aliyuncs.com |
更多地域请参考:[阿里云 OSS 访问域名](https://help.aliyun.com/document_detail/31837.html)
### 内网访问优化
如果您的 Web 服务器是阿里云 ECS 实例,建议启用内网访问:
```php
'use_internal' => true,
```
**优势**
- ✅ 访问速度更快
- ✅ 节省外网流量费用
- ✅ 自动使用 HTTPS 协议
**注意**:程序会自动将 `oss-cn-hangzhou.aliyuncs.com` 转换为 `https://oss-cn-hangzhou-internal.aliyuncs.com`
### 自定义域名配置
如果您已经在 OSS 控制台绑定了自定义域名:
1. 在 OSS 控制台绑定域名(例如:`files.example.com`
2. 配置 CNAME 解析
3. 在配置中设置:
```php
'custom_domain' => 'https://files.example.com',
```
**效果**:文件访问链接将使用自定义域名而不是 OSS 默认域名。
## 📁 功能说明
### 支持的操作
- **📂 浏览文件夹**:支持多级目录浏览
- **⬆️ 上传文件**:支持拖拽上传、分块上传大文件
- **⬇️ 下载文件**:直接下载或使用自定义域名
- **➕ 创建文件/文件夹**:包括 0 字节文件
- **✏️ 编辑文件**:在线文本编辑器,支持语法高亮
- **📝 查看文件**:支持文本、图片、音频、视频预览
- **🔄 重命名**:文件和文件夹重命名(支持大量文件的文件夹)
- **📋 复制**:文件和文件夹复制
- **🗑️ 删除**:文件和文件夹删除(批量删除优化)
- **🔍 搜索**:在当前目录搜索文件
### 批量操作优化
对于包含大量文件的文件夹,系统进行了以下优化:
- **文件夹重命名**:使用批量 API,每次处理 1000 个对象
- **文件夹删除**:批量删除,避免逐个删除导致超时
- **防重复提交**:操作完成前进程崩溃时,刷新页面会正确显示结果
## 🔧 技术架构
### 核心设计
1. **适配器模式**`FM_OSS_Adapter` 类封装所有 OSS 操作
2. **函数包装**:通过 `fm_*` 系列包装函数透明路由
3. **路径转换**`getOSSKey()` 自动转换本地路径为 OSS 对象键
4. **目录模拟**:使用前缀和分隔符模拟文件系统目录结构
### 包装函数列表
所有原生 PHP 文件系统函数都有对应的包装函数:
| 原生函数 | 包装函数 | 说明 |
|---------|---------|------|
| `is_file()` | `fm_is_file()` | 判断是否为文件 |
| `is_dir()` | `fm_is_dir()` | 判断是否为目录 |
| `file_exists()` | `fm_file_exists()` | 判断文件/目录是否存在 |
| `filesize()` | `fm_filesize()` | 获取文件大小 |
| `filemtime()` | `fm_filemtime()` | 获取修改时间 |
| `file_get_contents()` | `fm_file_get_contents()` | 读取文件内容 |
| `file_put_contents()` | `fm_file_put_contents()` | 写入文件内容 |
| `scandir()` | `fm_scandir()` | 列出目录内容 |
| `rename()` | `fm_rename()` | 重命名文件/目录 |
| `unlink()` | `fm_unlink()` | 删除文件 |
| `rmdir()` | `fm_rmdir()` | 删除目录 |
## 🐛 常见问题
### 1. 上传失败:failed to open output stream
**原因**:本地临时目录不可写
**解决方法**
```bash
# 检查临时目录权限
ls -la /tmp
# 修改权限
chmod 777 /tmp
```
### 2. 图片无法显示
**原因**:未配置自定义域名或 Bucket 权限设置
**解决方法**
- 配置自定义域名
- 或在 OSS 控制台设置 Bucket 为公共读
### 3. 删除/重命名文件夹时 502 错误
**原因**:文件夹包含大量文件,PHP 执行超时
**解决方法**
- ✅ 已优化:使用批量 API 减少调用次数
- ✅ 已优化:即使超时,刷新后会显示正确结果
- 如仍有问题,可增加 PHP 超时时间:
```php
// 在 myfile.php 顶部添加
set_time_limit(300); // 5分钟
```
### 4. 内网访问连接超时
**原因**:配置错误或网络问题
**解决方法**
1. 确认 ECS 和 OSS 在同一地域
2. 检查配置:
```php
'use_internal' => true, // 必须为 true
'endpoint' => 'oss-cn-hangzhou.aliyuncs.com', // 不要手动添加 -internal
```
3. 程序会自动转换为 `https://oss-cn-hangzhou-internal.aliyuncs.com`
### 5. 文件重命名提示"源文件不存在"
**原因**:表单重复提交
**解决方法**
- ✅ 已修复:刷新页面会检查操作是否已完成
- 如果操作确实成功,忽略此错误即可
## 🔐 安全建议
1. **修改默认密码**:首次登录后立即修改
2. **使用 HTTPS**:启用 SSL 加密传输
3. **限制访问**:使用 `.htaccess` 或 Nginx 配置限制 IP
4. **定期更新**:关注安全更新
5. **AccessKey 安全**
- 使用 RAM 子账号,仅授予必要的 OSS 权限
- 定期轮换 AccessKey
- 不要将 AccessKey 提交到代码仓库
## 📝 更新日志
### v2.6-OSS (2025-11-26)
**新增功能**
- ✅ 阿里云 OSS 完整支持
- ✅ 自定义域名支持
- ✅ 内网访问自动优化
- ✅ 0 字节文件显示
**性能优化**
- ✅ 文件夹重命名批量操作(最多 1000 个/批次)
- ✅ 文件夹删除批量操作
- ✅ 防重复提交机制
**Bug 修复**
- ✅ 修复图片查看 getimagesize 错误
- ✅ 修复文件编辑保存失败
- ✅ 修复文件夹删除 502 错误
- ✅ 修复内网访问端口错误
- ✅ 修复 fileExists 无法识别目录
## 📞 技术支持
- **原版项目**[Tiny File Manager](https://github.com/prasathmani/tinyfilemanager)
- **阿里云 OSS SDK**[aliyuncs/oss-sdk-php](https://github.com/aliyun/aliyun-oss-php-sdk)
- **OSS 文档**[阿里云对象存储 OSS](https://help.aliyun.com/product/31815.html)
## 📄 许可证
本项目基于 Tiny File Manager,遵循 GPL-3.0 许可证。
---
**⚠️ 免责声明**:请确保遵守阿里云服务条款,合理使用 OSS 资源。本项目仅供学习交流使用。