package main
import ( "fmt"
"io/ioutil"
"net/http"
"os"
"sort"
"strings"
"time"
"github.com/gin-gonic/gin"
复制代码
)
var (
dir string = "/home/workspace/vincent/"
// dir string = "/Users/vincent/Public/"
)
复制代码
func main() {
r := gin.Default()
//加载静态文件
r.Static("/dwz", "templates/statics")
//加载模版
r.LoadHTMLGlob("templates/user/*")
//r.LoadHTMLFiles("templates/user/*")
// 最大文件大小M
r.MaxMultipartMemory = 8 << 20
// 跳转上传页面
r.GET("/index", func(c *gin.Context) {
c.HTML(http.StatusOK, "upload.html", gin.H{
"title": "hello",
})
})
//路由分组
group1 := r.Group("/bigfile")
//验证是否上传过该文件
group1.POST("/check", func(c *gin.Context) {
fileMd5 := c.PostForm("fileMd5")
path := dir + "wisemodel" + "/" + "merge" + "/" + fileMd5
if _, err := os.Stat(path); !os.IsNotExist(err) { //判断是否已经上传过该文件,设置返回code 为 -1 :秒传
//os.MkdirAll(path, os.ModePerm)
c.JSON(http.StatusOK, gin.H{
"resultCode": -1, // 说明已上传
})
}
result := 0
// 获取目录里上传文件分片数量
files, err := ioutil.ReadDir(dir + "wisemodel" + "/" + fileMd5)
if err != nil || len(files) == 0 { //文件没有上传过,下标为零
result = 0
} else { //文件上传中断过,返回当前已经上传到的下标
result = len(files) - 1 //继续上传,断点续传
}
c.JSON(http.StatusOK, gin.H{
"resultCode": result,
})
})
//上传文件分片
group1.POST("/upload", func(c *gin.Context) {
//fileName := c.PostForm("name") // 获取文件名
chunkIndex := c.PostForm("chunk") // 获取分片下标
fileMd5 := c.PostForm("md5") //获取文件md5
dst := dir + "wisemodel" + "/" + fileMd5
if _, err := os.Stat(dst); os.IsNotExist(err) { //判断是否存在
os.MkdirAll(dst, os.ModePerm)
}
if file, err := c.FormFile("file"); err == nil { //获取分片文件
c.SaveUploadedFile(file, dst+"/"+strings.Trim(chunkIndex, ""))
}
})
//合并分片
group1.POST("/merge", func(c *gin.Context) {
fileName := c.PostForm("fileName")
fileMd5 := c.PostForm("fileMd5")
path := dir + "wisemodel" + "/" + fileMd5 //分片存储位置
// 获取目录里上传文件分片数量
files, err := ioutil.ReadDir(path)
if err != nil || len(files) == 0 {
panic(err)
}
//按名字排序
sort.SliceStable(files, func(i, j int) bool {
return files[i].Name() < files[j].Name()
})
realFilePath := dir + "wisemodel" + "/" + "merge" + "/" + fileMd5
os.MkdirAll(realFilePath, os.ModePerm) //创建目录
// 创建一个需要合并的文件
realFile, err := os.OpenFile(realFilePath+"/"+fileName, os.O_CREATE|os.O_TRUNC|os.O_RDWR, os.ModePerm)
defer realFile.Close()
if err != nil {
panic(err)
}
for _, v := range files {//
f, err := os.OpenFile(path+"/"+v.Name(), os.O_RDONLY, os.ModePerm)
if err != nil {
fmt.Println(err)
}
b, err := ioutil.ReadAll(f)
if err != nil {
fmt.Println(err)
}
realFile.Write(b)
// 关闭分片
f.Close()
os.Remove(f.Name()) 合并后,删除分片
}
})
group1.GET("downupload", func(c *gin.Context) {//测试文件下载
c.File(dir + "wisemodel/merge/0844dbdedf5f4b2edc2ddd85475e0a47/OKR工作法.pdf")
})
//默认为监听8080端口
r.Run(":8000")
复制代码
}