添加本地上传的功能

This commit is contained in:
2026-01-30 21:40:21 +08:00
parent 38ebe73e45
commit a6e8101e09
16 changed files with 531 additions and 58 deletions

View File

@@ -2,12 +2,13 @@
## 概述
配置工具提供了从外部文件加载和管理应用配置的功能支持数据库、OSS、Redis、CORS、MinIO、邮件、短信等常用服务的配置。
配置工具提供了从外部文件加载和管理应用配置的功能,支持数据库、LocalStorage、OSS、Redis、CORS、MinIO、邮件、短信等常用服务的配置。
## 功能特性
- 支持从外部JSON文件加载配置
- 支持数据库配置MySQL、PostgreSQL、SQLite
- 支持本地存储配置LocalStorage文件上传保存到本地文件夹
- 支持OSS对象存储配置阿里云、腾讯云、AWS、七牛云等
- 支持Redis配置
- 支持CORS配置与middleware包集成
@@ -75,6 +76,10 @@
"region": "us-east-1",
"domain": "http://localhost:9000"
},
"localStorage": {
"baseDir": "./uploads",
"publicURL": "http://localhost:8080/file?key={objectKey}"
},
"email": {
"host": "smtp.example.com",
"port": 587,
@@ -196,6 +201,16 @@ if minioConfig != nil {
}
```
### 6.1 获取本地存储配置LocalStorage
```go
localCfg := config.GetLocalStorage()
if localCfg != nil {
fmt.Printf("Local baseDir: %s\n", localCfg.BaseDir)
fmt.Printf("Local publicURL: %s\n", localCfg.PublicURL)
}
```
## 配置项说明
### DatabaseConfig 数据库配置
@@ -266,6 +281,13 @@ if minioConfig != nil {
| Region | string | 区域 |
| Domain | string | 自定义域名 |
### LocalStorageConfig 本地存储配置
| 字段 | 类型 | 说明 |
|------|------|------|
| BaseDir | string | 本地文件保存根目录(必填) |
| PublicURL | string | 对外访问 URL可选。包含 `{objectKey}` 占位符时会替换为 `url.QueryEscape(objectKey)`;不包含时作为 URL 前缀拼接 |
### EmailConfig 邮件配置
| 字段 | 类型 | 说明 | 默认值 |

View File

@@ -2,10 +2,11 @@
## 概述
存储工具提供了文件上传和查看功能,支持OSS和MinIO种存储方式并提供HTTP处理器用于文件上传和代理查看。
存储工具提供了文件上传和查看功能,支持 **本地文件夹(Local)**、OSS 和 MinIO种存储方式并提供HTTP处理器用于文件上传和代理查看。
## 功能特性
- 支持本地文件夹存储Local
- 支持OSS对象存储阿里云、腾讯云、AWS、七牛云等
- 支持MinIO对象存储
- 提供统一的存储接口
@@ -17,6 +18,32 @@
## 使用方法
### 0. 工厂调用方式(推荐)
当你使用 `factory` 黑盒模式时,外部项目无需关心底层是 Local/MinIO/OSS
```go
import (
"context"
"os"
"git.toowon.com/jimmy/go-common/factory"
"git.toowon.com/jimmy/go-common/storage"
)
fac, _ := factory.NewFactoryFromFile("./config.json")
f, _ := os.Open("test.jpg")
defer f.Close()
objectKey := storage.GenerateObjectKeyWithDate("uploads/images", "test.jpg")
url, err := fac.UploadFile(context.Background(), objectKey, f, "image/jpeg")
if err != nil {
panic(err)
}
_ = url
```
### 1. 创建存储实例
```go
@@ -42,6 +69,12 @@ minioStorage, err := storage.NewStorage(storage.StorageTypeMinIO, cfg)
if err != nil {
log.Fatal(err)
}
// 创建本地存储实例
localStorage, err := storage.NewStorage(storage.StorageTypeLocal, cfg)
if err != nil {
log.Fatal(err)
}
```
### 2. 上传文件
@@ -76,6 +109,25 @@ if err != nil {
fmt.Printf("File URL: %s\n", url)
```
### 2.1 本地存储配置示例
`config.json` 增加 `localStorage` 配置段:
```json
{
"localStorage": {
"baseDir": "./uploads",
"publicURL": "http://localhost:8080/file?key={objectKey}"
}
}
```
说明:
- **baseDir**:文件保存根目录
- **publicURL**:用于 `GetURL()` 返回对外可访问的 URL
- 推荐配合本文的 `ProxyHandler`,示例 `http://localhost:8080/file?key={objectKey}`
- `{objectKey}` 会自动做 `url.QueryEscape` 处理
### 3. 使用HTTP处理器上传文件
```go
@@ -136,6 +188,10 @@ http.Handle("/file", proxyHandler)
http.ListenAndServe(":8080", nil)
```
**本地存储建议搭配:**
- `POST /upload` 上传文件(返回 `url`
- `GET /file?key=...` 通过代理读取本地文件并返回二进制内容
**查看请求示例:**
```
GET /file?key=images/test.jpg