golang实现临时文件上传系统的插件库Plik的使用

Golang 实现临时文件上传系统的插件库 Plik 使用指南

Plik 简介

Plik 是一个用 Golang 编写的可扩展且友好的临时文件上传系统(类似 Wetransfer)。

Mentioned in Awesome Go

主要特性

  • 强大的命令行客户端
  • 易于使用的 Web UI
  • 多种数据后端:文件、OpenStack Swift、S3、Google 云存储
  • 多种元数据后端:Sqlite3、PostgreSQL、MySQL
  • OneShot:文件在第一次下载后销毁
  • 流式传输:文件直接从上传者流式传输到下载者(服务器端不存储)
  • 可删除:允许上传者随时删除文件
  • TTL:自定义过期时间
  • 密码保护:使用登录/密码保护上传(基本认证)
  • 评论:添加自定义消息(Markdown 格式)
  • 用户认证:本地/Google/OVH
  • 上传限制:源 IP/令牌
  • 管理员 CLI 和 Web UI
  • 服务器端加密(使用 S3 数据后端)
  • 多架构构建和 Docker 镜像

安装

从发布版安装

运行 Plik 非常简单:

$ wget https://github.com/root-gg/plik/releases/download/1.3.8/plik-1.3.8-linux-amd64.tar.gz
$ tar xzvf plik-1.3.8-linux-amd64.tar.gz
$ cd plik-1.3.8-linux-amd64/server
$ ./plikd

现在你有一个功能完整的 Plik 实例运行在 http://127.0.0.1:8080

从源码安装

要编译 Plik 源码,你需要系统上安装有 Golang 和 npm。

克隆项目并运行 make:

$ make
$ cd server && ./plikd

Docker 安装

Plik 提供多架构 Docker 镜像:

  • rootgg/plik:latest(最新发布版)
  • rootgg/plik:{version}(特定版本)
  • rootgg/plik:dev(master 分支最新提交)

配置

配置使用 TOML 文件 plikd.cfg 管理。

使用环境变量定义配置参数

可以通过环境变量指定配置参数:

PLIKD_DEBUG_REQUESTS=true ./plikd

对于数组和配置映射,必须以 JSON 格式提供。

数据后端

Plik 提供了多种数据后端用于存储上传的文件:

  • 文件数据后端:在本地或挂载的文件系统目录中存储上传的文件
  • Openstack Swift 数据后端:高度可用、分布式、最终一致的对象/Blob 存储,支持服务器端加密
  • Amazon S3
  • Google 云存储

元数据后端

  • Sqlite3:适合独立部署
  • PostgreSQL / MySQL:适合分布式/高可用性部署

Web UI

默认情况下,Plikd 在与 API 相同的端口上提供 Angularjs Web UI。

CLI 客户端

Plik 附带了一个强大的 Golang 跨平台 CLI 客户端:

Usage:
  plik [options] [FILE] ...

Options:
  -h --help                 显示帮助
  -d --debug                启用调试模式
  -q --quiet                启用静默模式
  -o, --oneshot             启用 OneShot(每个文件在第一次下载后删除)
  -r, --removable           启用可删除上传(任何人都可以随时删除)
  -S, --stream              启用流式传输(将阻塞直到远程用户开始下载)
  -t, --ttl TTL             过期前的时间(上传将在 m|h|d 后删除)
  -n, --name NAME           从 STDIN 管道传输时设置文件名
  --server SERVER           覆盖 plik URL
  --token TOKEN             指定上传令牌
  --comments COMMENT        设置上传的评论(支持 MarkDown)
  -p                        用登录和密码保护上传
  --password PASSWD         用 login:password 保护上传(如果省略,默认登录是 "plik")
  -a                        使用默认存档参数存档上传
  --archive MODE            使用指定存档后端:tar|zip
  --compress MODE           [tar] 压缩编解码器:gzip|bzip2|xz|lzip|lzma|lzop|compress|no
  --archive-options OPTIONS [tar|zip] 附加命令行选项
  -s                        使用默认加密参数加密上传
  --not-secure              不加密上传
  --secure MODE             使用指定加密后端:openssl|pgp
  --cipher CIPHER           [openssl] 使用的 Openssl 密码
  --passphrase PASSPHRASE   [openssl] 密码或 '-' 提示输入密码
  --recipient RECIPIENT     [pgp] 设置 pgp 后端的收件人
  --secure-options OPTIONS  [openssl|pgp] 附加命令行选项
  --update                  更新客户端
  -v --version              显示客户端版本

Go 客户端示例

Plik 现在附带了一个 Golang 库,以下是使用示例:

package main

import (
	"fmt"
	"os"
	
	"github.com/root-gg/plik/plik"
)

func main() {
	// 创建 Plik 客户端
	client := plik.NewClient("http://127.0.0.1:8080")
	
	// 创建新上传
	upload, err := client.NewUpload()
	if err != nil {
		fmt.Printf("创建上传失败: %v\n", err)
		os.Exit(1)
	}
	
	// 添加文件
	file, err := upload.AddFileFromPath("example.txt")
	if err != nil {
		fmt.Printf("添加文件失败: %v\n", err)
		os.Exit(1)
	}
	
	// 设置文件选项
	file.OneShot = true      // 下载后删除
	file.Removable = true    // 允许删除
	file.TTL = 3600          // 1小时后过期
	
	// 上传文件
	err = upload.Upload()
	if err != nil {
		fmt.Printf("上传失败: %v\n", err)
		os.Exit(1)
	}
	
	// 打印上传 URL
	fmt.Printf("上传成功!访问 URL: %s\n", upload.URL())
}

快速使用 curl 上传

curl --form 'file=@/path/to/file' http://127.0.0.1:8080

启用身份验证且禁止匿名上传时,可以使用用户令牌快速上传:

curl --form 'file=@/path/to/file' --header 'X-PlikToken: xxxx-xxx-xxxx-xxxxx-xxxxxxxx' http://127.0.0.1:8080

安全

Plik 允许用户上传和提供任何内容,但托管不受信任的 HTML 会带来一些众所周知的安全问题。

贡献

欢迎贡献,请随时提出问题或提交拉取请求。


更多关于golang实现临时文件上传系统的插件库Plik的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现临时文件上传系统的插件库Plik的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用Plik实现Golang临时文件上传系统

Plik是一个开源的临时文件上传系统,可以轻松集成到Golang应用中。下面我将介绍如何使用Plik的Golang客户端库实现文件上传功能。

Plik简介

Plik是一个类似Pastebin的文件上传服务,主要特点包括:

  • 文件自动过期(可设置1小时到1年)
  • 支持大文件上传
  • 提供REST API
  • 支持多种客户端(包括Golang)

安装Plik客户端库

首先安装Plik的Golang客户端:

go get github.com/root-gg/plik/client

基本使用示例

1. 简单文件上传

package main

import (
	"fmt"
	"os"
	
	"github.com/root-gg/plik/client"
)

func main() {
	// 创建Plik客户端
	plikClient := client.NewPlikClient("https://plik.root.gg") // 可以使用自己的Plik服务器地址

	// 创建上传
	upload := plikClient.NewUpload()
	
	// 设置上传参数
	upload.OneShot = true       // 下载后自动删除
	upload.TTL = 3600           // 1小时后过期(秒)
	upload.RemoteIP = "1.2.3.4" // 可选,设置客户端IP

	// 添加文件
	file, err := upload.AddFileFromPath("example.txt") // 从路径添加文件
	if err != nil {
		fmt.Printf("无法添加文件: %v\n", err)
		os.Exit(1)
	}

	// 执行上传
	result, err := upload.Upload()
	if err != nil {
		fmt.Printf("上传失败: %v\n", err)
		os.Exit(1)
	}

	// 输出结果
	fmt.Printf("文件上传成功!\n")
	fmt.Printf("下载URL: %s\n", result.GetDownloadURL(file))
}

2. 从内存数据上传

package main

import (
	"fmt"
	"strings"
	
	"github.com/root-gg/plik/client"
)

func main() {
	plikClient := client.NewPlikClient("https://plik.root.gg")
	
	upload := plikClient.NewUpload()
	upload.TTL = 86400 // 24小时后过期

	// 从字符串内容创建文件
	file, err := upload.AddFileFromReader("hello.txt", strings.NewReader("Hello, World!"))
	if err != nil {
		fmt.Printf("无法创建文件: %v\n", err)
		return
	}

	// 上传
	result, err := upload.Upload()
	if err != nil {
		fmt.Printf("上传失败: %v\n", err)
		return
	}

	fmt.Printf("上传成功! 下载URL: %s\n", result.GetDownloadURL(file))
}

3. 高级配置示例

package main

import (
	"fmt"
	"os"
	"time"
	
	"github.com/root-gg/plik/client"
)

func main() {
	// 创建自定义配置的客户端
	plikClient := client.NewPlikClient("https://plik.example.com")
	plikClient.InsecureHTTP = true // 如果使用HTTP而非HTTPS
	plikClient.Debug = true       // 启用调试输出

	// 创建上传
	upload := plikClient.NewUpload()
	
	// 设置高级选项
	upload.OneShot = true
	upload.TTL = int((24 * time.Hour).Seconds()) // 24小时
	upload.Login = "user@example.com"            // 可选认证
	upload.Password = "password"
	upload.Comments = "这是测试上传"               // 添加注释

	// 添加多个文件
	file1, err := upload.AddFileFromPath("document.pdf")
	if err != nil {
		fmt.Printf("无法添加文件1: %v\n", err)
		os.Exit(1)
	}
	
	file2, err := upload.AddFileFromReader("notes.txt", strings.NewReader("重要笔记内容"))
	if err != nil {
		fmt.Printf("无法添加文件2: %v\n", err)
		os.Exit(1)
	}

	// 上传
	result, err := upload.Upload()
	if err != nil {
		fmt.Printf("上传失败: %v\n", err)
		os.Exit(1)
	}

	// 输出结果
	fmt.Println("上传成功!")
	fmt.Printf("文件1 URL: %s\n", result.GetDownloadURL(file1))
	fmt.Printf("文件2 URL: %s\n", result.GetDownloadURL(file2))
	fmt.Printf("管理URL: %s\n", result.GetAdminURL()) // 用于删除上传等管理操作
}

错误处理

Plik客户端可能会返回以下常见错误:

result, err := upload.Upload()
if err != nil {
    switch err {
    case client.ErrFileTooBig:
        fmt.Println("文件太大")
    case client.ErrUploadNotFound:
        fmt.Println("上传不存在")
    case client.ErrServerError:
        fmt.Println("服务器错误")
    default:
        fmt.Printf("上传错误: %v\n", err)
    }
    return
}

部署自己的Plik服务器

如果想自己托管Plik服务器,可以参考官方文档:

  1. 使用Docker快速部署:
docker run -d --name plik -p 8080:8080 -v /path/to/data:/home/plik/data rootgg/plik
  1. 然后客户端可以连接自己的服务器:
plikClient := client.NewPlikClient("http://localhost:8080")

总结

Plik为Golang应用提供了一个简单而强大的临时文件上传解决方案。通过其Golang客户端库,可以轻松实现文件上传功能,并支持丰富的配置选项。无论是快速分享文件还是作为应用的文件暂存服务,Plik都是一个不错的选择。

回到顶部