添加本地上传的功能

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,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