Go语言图床V2.0

浏览量3582

Go语言图床V2.0

图床V2.0的开发契机是这学期工业软件课程的大作业,1.0版本功能较为简单,客户端只能上传截图后在调色板的图片,但是服务器在1.0版本就实现了用Java进行交互作为文件服务器,也就是现在这个博客用的文件服务器。2.0更新了可以复制文件后直接上传至服务器,文件共享更为方便,还增加了一个特色功能就是配置文件的热部署,修改配置文件后马上生效,无需重启主程序。

本博客也来自于课程作业的开发文档稍作修改后完成。

一、基本信息

1.1 开发目的

作为一名开发人员, 在编写开发文档时肯定是要用markdown这个利器来写的,但是有一点缺点就是markdown给其他人发送时,如果文档内有图片的话还需要另外把图片发送给接收者,而且可能还会出现文件路径不匹配等等问题,这是极其不便的。但是markdown还有一项极其优秀的特性就是可以加载在网络上的图片,所以我就想我们完全可以把图片上传到服务器,然后就可以完美的共享我们的文档了,然后由此延伸的就是一个可以实时分享文件的服务器系统,在此激发下,我们就想要完成一个具有此功能的客户端和服务器

1.2 技术选型

代码全部使用go 1.13windows 10上进行开发, 使用的IDE为IDEA

之所以选择go作为编程语言主要考量为以下几个方面

  1. go语言有优秀的网络开发包,可以方便的进行网络开发
  2. go语言具有交叉编译的特性, 在windows平台上可以编译linux等平台的可执行文件
  3. go语言比较小巧, 编译后的可执行文件很小, 资源占用也很小, 适合作为这种长时间运行的程序

1.3 运行环境

客户端: windows

服务端: windows/linux

由于客户端大量使用了 windows 平台特有的 API 故失去了跨平台的能力, 只能在 windows 平台上使用

服务端程序可运行在windows和linux平台上, 也因此同时提供了两个平台的安装包

二、功能介绍

项目的客户端设计之初只是为了文件的共享方便, 故只保留了基础功能, 服务器端有额外的图片剪裁和文件删除系统, 是为了作为一个服务端程序的完整性, 后期可以为服务器编写其他编程语言的SDK, 作为一个单体应用的文件服务器还是有着不错的性能的。

2.1 基本功能

客户端:
  • 截图快捷键上传(快捷键可配置): 使用截图工具截图后按设定快捷键一键上传截图到服务器, 并以当前微秒数命名, 并把上传后的地址回写到剪切板, 可使用ctrl+v直接发送给想要分享的人
  • 文件快捷键上传(快捷键可配置): 选中文件复制后可直接按快捷键一键上传到设定分组的服务器地址, 保留当前文件的名称, 并把上传后的地址回写到剪切板, 可使用ctrl+v直接发送给想要分享的人
服务器:
  • 文件在线访问下载: 直接把对应地址复制到浏览器地址栏即可访问
  • 图片分组上传(分组由客户端设置)
  • 文件分组上传
  • 图片服务端缩放分辨率 (算法过程: 遍历图片的像素点进行像素点的压缩)
  • 文件删除

2.2 特色功能

  • 文件对称加密上传: 采用设置密钥进行数据传输, 保护服务器不受外部攻击
  • 配置文件热部署: 配置文件发生修改后立刻生效, 无需重启程序
  • 支持并发上传: 对每个客户端的上传开启单独的goroutine; 图片上传时会根据当前时间的微秒数进行文件的命名, 对并发情况下的文件id生成做了一定的同步处理, 使得服务端在高并发的情况下依旧运行稳定

三、操作手册

3.1 配置文件

本系统采用json格式作为配置文件, 可读性好

客户端:

{
  "serverUrl": "http://127.0.0.1:8600",
  "auth": "vergessen",
  "groups": [
    {
      "groupName": "test",
      "shortcutKey": "ctrl+space"
    }
  ]
}

serverUrl: 服务器地址

auth: 密钥 用于与服务器对称加密

groups: 图片分组

  • groupName: 分组名称, 文件上传时会上传至服务器的对应文件夹
  • shortcutKey: 快捷键, 复制文件或者截图后按设定快捷键可以将文件一键上传至服务器

服务端:

{
  "port": ":8600",
  "filePath": "images",
  "Auth": "vergessen"
}

port: 服务器对外暴露的服务端口地址

filePath: 服务器存储文件的地址

Auth: 密钥 客户端访问服务器需要提供 sha256 加密后的该密钥

3.2 启动程序

客户端:

直接双击 client-windows.zip下的ImgGo.exe程序即可启动程序, 将自动读取conf下的配置文件client.json, 并将日志写入log/clinet.log中, 截图或复制文件后使用配置文件设置的快捷键即可上传文件

自动启动: win+R打开运行窗口,输入shell:startup,然后在出现的文件夹里放入我们的ImgGo.exe的快捷方式,然后我们就可以在任务管理器看到如下信息

服务端:

windows: 双击ImgGoServer.exe即可执行, 若需要自己制定日志文件可在cmd执行ImgGoServer.exe [日志文件路径]

linux: 解压后在命令行执行ImgGoServer [日志文件路径]即可,其中日志文件路径是可选的, 默认将日志写入到log/server.log中, 若不能直接执行则需要执行chomd ImgGoServer 777修改文件的权限

3.3 程序测试

客户端:

启动

上传截图

访问上传结果

服务器端文件夹:

可以看到文件上传已经成功(展示图片均为后期上传至远程服务器)

四、编译程序

golang运行部署还是很方便的,不过要注意的就是想让客户端不弹窗后台运行,以及发送给别人用需要加一些特殊的参数

go build -ldflags "-extldflags \"-static\" -s -w -H windowsgui" main/client/ImgGo.go

服务端在win下编译linux可执行文件需要交叉编译,依次在控制台输入就可以编译完成

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build main/server/ImgGoServer.go

编译win下的可执行文件可直接执行

go build main/server/ImgGoServer.go

五、项目总结

项目中我们遇到并解决了很多问题,由于go语言还是一门比较年轻的编程语言, 相关的资料相对来说还是比较少的。特别是windows剪切板系统调用以及文件热部署部分我查阅了很多的资料,甚至可以说把百度谷歌相关词条的搜索结果都翻遍了最终才写出了这相对完善的系统,在这过程中收获还是很大的,掌握了由go语言调用系统函数的相关技能以及更加深入了解了监视者设计模式。

其中项目的服务器端更是可以直接作为其他程序可直接调用的公用的服务端程序,在今后编写小应用的时候更是可以把服务端程序直接作为一个文件服务器使用,也极大的方便了今后的开发。

评论

添加一条评论