golang实现临时文件上传系统的插件库Plik的使用
Golang 实现临时文件上传系统的插件库 Plik 使用指南
Plik 简介
Plik 是一个用 Golang 编写的可扩展且友好的临时文件上传系统(类似 Wetransfer)。
主要特性
- 强大的命令行客户端
- 易于使用的 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
更多关于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服务器,可以参考官方文档:
- 使用Docker快速部署:
docker run -d --name plik -p 8080:8080 -v /path/to/data:/home/plik/data rootgg/plik
- 然后客户端可以连接自己的服务器:
plikClient := client.NewPlikClient("http://localhost:8080")
总结
Plik为Golang应用提供了一个简单而强大的临时文件上传解决方案。通过其Golang客户端库,可以轻松实现文件上传功能,并支持丰富的配置选项。无论是快速分享文件还是作为应用的文件暂存服务,Plik都是一个不错的选择。