exa_breakpoint_continue.go 5.0 KB
Newer Older
1
package example
Mr.奇淼('s avatar
Mr.奇淼( 已提交
2 3

import (
Mr.奇淼('s avatar
Mr.奇淼( 已提交
4
	"fmt"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
5
	"github.com/flipped-aurora/gin-vue-admin/server/model/example"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
6
	"io/ioutil"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
7
	"mime/multipart"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
8
	"strconv"
S
songzhibin97 已提交
9

10 11 12 13
	"github.com/flipped-aurora/gin-vue-admin/server/global"
	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
	exampleRes "github.com/flipped-aurora/gin-vue-admin/server/model/example/response"
	"github.com/flipped-aurora/gin-vue-admin/server/utils"
S
songzhibin97 已提交
14 15
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
16 17 18 19 20 21 22
)

// @Tags ExaFileUploadAndDownload
// @Summary 断点续传到服务器
// @Security ApiKeyAuth
// @accept multipart/form-data
// @Produce  application/json
23
// @Param file formData file true "an example for breakpoint resume, 断点续传示例"
24
// @Success 200 {string} string "{"success":true,"data":{},"msg":"切片创建成功"}"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
25
// @Router /fileUploadAndDownload/breakpointContinue [post]
26
func (u *FileUploadAndDownloadApi) BreakpointContinue(c *gin.Context) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
27 28 29 30 31 32 33
	fileMd5 := c.Request.FormValue("fileMd5")
	fileName := c.Request.FormValue("fileName")
	chunkMd5 := c.Request.FormValue("chunkMd5")
	chunkNumber, _ := strconv.Atoi(c.Request.FormValue("chunkNumber"))
	chunkTotal, _ := strconv.Atoi(c.Request.FormValue("chunkTotal"))
	_, FileHeader, err := c.Request.FormFile("file")
	if err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
34
		global.GVA_LOG.Error("接收文件失败!", zap.Error(err))
35
		response.FailWithMessage("接收文件失败", c)
36
		return
Mr.奇淼('s avatar
Mr.奇淼( 已提交
37
	}
38 39
	f, err := FileHeader.Open()
	if err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
40
		global.GVA_LOG.Error("文件读取失败!", zap.Error(err))
41
		response.FailWithMessage("文件读取失败", c)
42 43
		return
	}
Mr.奇淼('s avatar
Mr.奇淼( 已提交
44 45 46 47 48 49
	defer func(f multipart.File) {
		err := f.Close()
		if err != nil {
			fmt.Println(err)
		}
	}(f)
50
	cen, _ := ioutil.ReadAll(f)
51
	if !utils.CheckMd5(cen, chunkMd5) {
Sliver_Horn's avatar
Sliver_Horn 已提交
52
		global.GVA_LOG.Error("检查md5失败!", zap.Error(err))
53
		response.FailWithMessage("检查md5失败", c)
54 55
		return
	}
56
	err, file := fileUploadAndDownloadService.FindOrCreateFile(fileMd5, fileName, chunkTotal)
57
	if err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
58
		global.GVA_LOG.Error("查找或创建记录失败!", zap.Error(err))
59
		response.FailWithMessage("查找或创建记录失败", c)
60 61 62 63
		return
	}
	err, pathc := utils.BreakPointContinue(cen, fileName, chunkNumber, chunkTotal, fileMd5)
	if err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
64
		global.GVA_LOG.Error("断点续传失败!", zap.Error(err))
65
		response.FailWithMessage("断点续传失败", c)
66 67 68
		return
	}

69
	if err = fileUploadAndDownloadService.CreateFileChunk(file.ID, pathc, chunkNumber); err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
70
		global.GVA_LOG.Error("创建文件记录失败!", zap.Error(err))
71
		response.FailWithMessage("创建文件记录失败", c)
72 73 74
		return
	}
	response.OkWithMessage("切片创建成功", c)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
75 76 77 78 79 80 81
}

// @Tags ExaFileUploadAndDownload
// @Summary 查找文件
// @Security ApiKeyAuth
// @accept multipart/form-data
// @Produce  application/json
82
// @Param file formData file true "Find the file, 查找文件"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
83 84
// @Success 200 {string} string "{"success":true,"data":{},"msg":"查找成功"}"
// @Router /fileUploadAndDownload/findFile [post]
85
func (u *FileUploadAndDownloadApi) FindFile(c *gin.Context) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
86 87 88
	fileMd5 := c.Query("fileMd5")
	fileName := c.Query("fileName")
	chunkTotal, _ := strconv.Atoi(c.Query("chunkTotal"))
89
	err, file := fileUploadAndDownloadService.FindOrCreateFile(fileMd5, fileName, chunkTotal)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
90
	if err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
91
		global.GVA_LOG.Error("查找失败!", zap.Error(err))
92
		response.FailWithMessage("查找失败", c)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
93
	} else {
94
		response.OkWithDetailed(exampleRes.FileResponse{File: file}, "查找成功", c)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
95 96 97 98
	}
}

// @Tags ExaFileUploadAndDownload
99
// @Summary 创建文件
Mr.奇淼('s avatar
Mr.奇淼( 已提交
100 101 102
// @Security ApiKeyAuth
// @accept multipart/form-data
// @Produce  application/json
103 104
// @Param file formData file true "上传文件完成"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"file uploaded, 文件创建成功"}"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
105
// @Router /fileUploadAndDownload/findFile [post]
106
func (b *FileUploadAndDownloadApi) BreakpointContinueFinish(c *gin.Context) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
107 108
	fileMd5 := c.Query("fileMd5")
	fileName := c.Query("fileName")
Mr.奇淼('s avatar
Mr.奇淼( 已提交
109
	err, filePath := utils.MakeFile(fileName, fileMd5)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
110
	if err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
111
		global.GVA_LOG.Error("文件创建失败!", zap.Error(err))
112
		response.FailWithDetailed(exampleRes.FilePathResponse{FilePath: filePath}, "文件创建失败", c)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
113
	} else {
114
		response.OkWithDetailed(exampleRes.FilePathResponse{FilePath: filePath}, "文件创建成功", c)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
115 116 117 118 119 120 121 122
	}
}

// @Tags ExaFileUploadAndDownload
// @Summary 删除切片
// @Security ApiKeyAuth
// @accept multipart/form-data
// @Produce  application/json
123
// @Param file formData file true "删除缓存切片"
124
// @Success 200 {string} string "{"success":true,"data":{},"msg":"缓存切片删除成功"}"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
125
// @Router /fileUploadAndDownload/removeChunk [post]
126
func (u *FileUploadAndDownloadApi) RemoveChunk(c *gin.Context) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
127 128 129
	var file example.ExaFile
	c.ShouldBindJSON(&file)
	err := utils.RemoveChunk(file.FileMd5)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
130
	if err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
131
		global.GVA_LOG.Error("缓存切片删除失败!", zap.Error(err))
Mr.奇淼('s avatar
Mr.奇淼( 已提交
132 133 134 135 136 137
		return
	}
	err = fileUploadAndDownloadService.DeleteFileChunk(file.FileMd5, file.FileName, file.FilePath)
	if err != nil {
		global.GVA_LOG.Error(err.Error(), zap.Error(err))
		response.FailWithMessage(err.Error(), c)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
138
	} else {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
139
		response.OkWithMessage("缓存切片删除成功", c)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
140 141
	}
}