golang轻量级文件分享与过期管理插件Gokapi的使用
Golang轻量级文件分享与过期管理插件Gokapi的使用
Gokapi简介
Gokapi是一个简单、自托管的文件分享服务器,具有自动过期和加密支持功能,非常适合需要隐私、控制和无杂乱的团队或个人使用。
可用平台
- 裸机运行 (Linux/macOS/Windows)
- Docker 容器
主要特性
- 文件分享过期: 在设定的下载次数或天数后自动删除
- 基于角色的用户管理: 细粒度的权限控制,只有注册用户才能上传
- 文件去重: 相同文件不会占用额外空间
- 云存储支持: 可选支持AWS S3(或兼容S3的服务如Backblaze B2)
- 内置加密: 包括端到端加密上传
- OpenID Connect支持: 可与Authelia或Keycloak等身份提供者集成
- REST API: 用于自动化和其他系统集成
- 可定制UI: 通过自定义CSS和JavaScript调整外观
界面截图
文件概览
API概览
用户概览
下载链接
快速开始
您可以使用Docker或在系统上直接部署Gokapi,只需几秒钟即可完成。
示例代码
以下是使用Gokapi API上传文件的示例代码:
package main
import (
"bytes"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
)
func main() {
// 准备文件上传
file, err := os.Open("example.txt")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
// 创建multipart表单
var requestBody bytes.Buffer
writer := multipart.NewWriter(&requestBody)
// 添加文件部分
part, err := writer.CreateFormFile("file", "example.txt")
if err != nil {
fmt.Println("Error creating form file:", err)
return
}
_, err = io.Copy(part, file)
if err != nil {
fmt.Println("Error copying file content:", err)
return
}
// 添加其他参数
writer.WriteField("expires", "7") // 7天后过期
writer.WriteField("downloads", "5") // 允许下载5次
writer.WriteField("password", "12345") // 设置下载密码
// 关闭写入器
err = writer.Close()
if err != nil {
fmt.Println("Error closing writer:", err)
return
}
// 创建HTTP请求
req, err := http.NewRequest("POST", "http://your-gokapi-server/api/upload", &requestBody)
if err != nil {
fmt.Println("Error creating request:", err)
return
}
// 设置内容类型和认证头
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("Authorization", "Bearer your-api-key")
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error sending request:", err)
return
}
defer resp.Body.Close()
// 读取响应
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response:", err)
return
}
fmt.Println("Response:", string(body))
}
获取文件信息的示例
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
)
type FileInfo struct {
ID string `json:"id"`
Name string `json:"name"`
Size int64 `json:"size"`
ExpireAt string `json:"expireAt"`
Downloads int `json:"downloads"`
MaxDownloads int `json:"maxDownloads"`
Password bool `json:"password"`
}
func main() {
// 创建HTTP请求获取文件信息
req, err := http.NewRequest("GET", "http://your-gokapi-server/api/file/12345", nil)
if err != nil {
fmt.Println("Error creating request:", err)
return
}
// 设置认证头
req.Header.Set("Authorization", "Bearer your-api-key")
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error sending request:", err)
return
}
defer resp.Body.Close()
// 读取响应
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response:", err)
return
}
// 解析JSON响应
var fileInfo FileInfo
err = json.Unmarshal(body, &fileInfo)
if err != nil {
fmt.Println("Error parsing JSON:", err)
return
}
fmt.Printf("File Info:\nID: %s\nName: %s\nSize: %d bytes\nExpires: %s\nDownloads: %d/%d\nProtected: %t\n",
fileInfo.ID, fileInfo.Name, fileInfo.Size, fileInfo.ExpireAt,
fileInfo.Downloads, fileInfo.MaxDownloads, fileInfo.Password)
}
许可证
本项目采用AGPL3许可证。
更多关于golang轻量级文件分享与过期管理插件Gokapi的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang轻量级文件分享与过期管理插件Gokapi的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Gokapi: 轻量级文件分享与过期管理插件
Gokapi是一个用Go语言编写的轻量级文件分享系统,具有过期管理功能。它非常适合需要临时分享文件并自动清理的场景。
主要特性
- 简单易用的文件上传和分享
- 自动过期管理
- 密码保护功能
- 下载次数限制
- 轻量级,资源占用低
安装与配置
安装方法
go get github.com/Forceu/gokapi
或者直接下载预编译的二进制文件。
基本配置
Gokapi使用YAML配置文件,默认位置是config.yml
:
Server:
Port: "127.0.0.1:53843"
PublicUrl: "http://localhost:53843"
ConfigVersion: 12
Authentication:
Username: "admin"
Password: "password"
Files:
StorageDir: "./files"
DataDir: "./data"
MaxMemory: "10MB"
DownloadDomain: ""
RedirectUrl: ""
基本使用示例
初始化Gokapi
package main
import (
"github.com/Forceu/gokapi/cmd/gokapi"
"log"
)
func main() {
// 初始化配置
config, err := gokapi.ReadConfig("config.yml")
if err != nil {
log.Fatal("Error reading config:", err)
}
// 启动服务器
gokapi.StartServer(config)
}
文件上传API示例
package main
import (
"bytes"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
)
func uploadFile(url, filePath, apiKey string) {
// 打开文件
file, err := os.Open(filePath)
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
// 创建multipart writer
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
// 添加文件
part, err := writer.CreateFormFile("file", file.Name())
if err != nil {
fmt.Println("Error creating form file:", err)
return
}
_, err = io.Copy(part, file)
if err != nil {
fmt.Println("Error copying file:", err)
return
}
// 添加其他参数
_ = writer.WriteField("expireDays", "7") // 7天后过期
_ = writer.WriteField("downloads", "5") // 最多下载5次
_ = writer.WriteField("password", "1234") // 设置密码
err = writer.Close()
if err != nil {
fmt.Println("Error closing writer:", err)
return
}
// 创建请求
req, err := http.NewRequest("POST", url, body)
if err != nil {
fmt.Println("Error creating request:", err)
return
}
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("Api-Key", apiKey)
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error sending request:", err)
return
}
defer resp.Body.Close()
// 读取响应
respBody, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response:", err)
return
}
fmt.Println("Response:", string(respBody))
}
func main() {
uploadFile("http://localhost:53843/api/upload", "example.txt", "your-api-key")
}
文件下载管理
Gokapi会自动生成下载链接,格式为:http://your-server/download?id=FILE_ID
你可以通过API管理文件:
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
type FileInfo struct {
ID string `json:"id"`
Name string `json:"name"`
Size int64 `json:"size"`
ExpireAt int64 `json:"expireAt"`
Downloads int `json:"downloads"`
MaxDownloads int `json:"maxDownloads"`
}
func getFileInfo(serverURL, fileID, apiKey string) {
url := fmt.Sprintf("%s/api/file?id=%s", serverURL, fileID)
req, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Println("Error creating request:", err)
return
}
req.Header.Set("Api-Key", apiKey)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error sending request:", err)
return
}
defer resp.Body.Close()
var fileInfo FileInfo
err = json.NewDecoder(resp.Body).Decode(&fileInfo)
if err != nil {
fmt.Println("Error decoding response:", err)
return
}
fmt.Printf("File Info:\nID: %s\nName: %s\nSize: %d bytes\nExpires: %d\nDownloads: %d/%d\n",
fileInfo.ID, fileInfo.Name, fileInfo.Size, fileInfo.ExpireAt,
fileInfo.Downloads, fileInfo.MaxDownloads)
}
func main() {
getFileInfo("http://localhost:53843", "example-file-id", "your-api-key")
}
过期文件清理
Gokapi会自动清理过期文件,你也可以手动触发清理:
package main
import (
"fmt"
"net/http"
)
func runCleanup(serverURL, apiKey string) {
url := fmt.Sprintf("%s/api/cleanup", serverURL)
req, err := http.NewRequest("POST", url, nil)
if err != nil {
fmt.Println("Error creating request:", err)
return
}
req.Header.Set("Api-Key", apiKey)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error sending request:", err)
return
}
defer resp.Body.Close()
if resp.StatusCode == http.StatusOK {
fmt.Println("Cleanup completed successfully")
} else {
fmt.Println("Cleanup failed with status:", resp.Status)
}
}
func main() {
runCleanup("http://localhost:53843", "your-api-key")
}
总结
Gokapi是一个简单而强大的文件分享解决方案,特别适合需要临时文件分享的场景。它的主要优势包括:
- 轻量级,资源占用低
- 自动过期管理
- 灵活的下载限制
- 密码保护功能
- 简单的API集成
通过上述示例代码,你可以快速集成Gokapi到你的应用中,实现安全的临时文件分享功能。