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")
复制代码

}