golang轻量级文件分享与过期管理插件Gokapi的使用

Golang轻量级文件分享与过期管理插件Gokapi的使用

Gokapi简介

Gokapi是一个简单、自托管的文件分享服务器,具有自动过期和加密支持功能,非常适合需要隐私、控制和无杂乱的团队或个人使用。

可用平台

  • 裸机运行 (Linux/macOS/Windows)
  • Docker 容器

主要特性

  • 文件分享过期: 在设定的下载次数或天数后自动删除
  • 基于角色的用户管理: 细粒度的权限控制,只有注册用户才能上传
  • 文件去重: 相同文件不会占用额外空间
  • 云存储支持: 可选支持AWS S3(或兼容S3的服务如Backblaze B2)
  • 内置加密: 包括端到端加密上传
  • OpenID Connect支持: 可与Authelia或Keycloak等身份提供者集成
  • REST API: 用于自动化和其他系统集成
  • 可定制UI: 通过自定义CSS和JavaScript调整外观

界面截图

文件概览

File Overview

API概览

API Overview

用户概览

User Overview

下载链接

Download Link

快速开始

您可以使用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语言编写的轻量级文件分享系统,具有过期管理功能。它非常适合需要临时分享文件并自动清理的场景。

主要特性

  1. 简单易用的文件上传和分享
  2. 自动过期管理
  3. 密码保护功能
  4. 下载次数限制
  5. 轻量级,资源占用低

安装与配置

安装方法

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是一个简单而强大的文件分享解决方案,特别适合需要临时文件分享的场景。它的主要优势包括:

  1. 轻量级,资源占用低
  2. 自动过期管理
  3. 灵活的下载限制
  4. 密码保护功能
  5. 简单的API集成

通过上述示例代码,你可以快速集成Gokapi到你的应用中,实现安全的临时文件分享功能。

回到顶部