golang上传当处理大文件上传时,分块上传和流式上传

作者: adm 分类: go 发布时间: 2023-09-02

golang上传当处理大文件上传时,分块上传和流式上传

type Uploads struct {
}

type ReturnPdf struct {
	Url string `json:"url"`
	Img string `json:"img"`
	Name string `json:"name"`
}

func (e Uploads ) ChunkUpload(c *gin.Context) (returnPdf storage.ReturnPdf, err error) {
	// 获取文件信息
	file, header, err := c.Request.FormFile("file")
	if err != nil {
		return returnPdf, err
	}
	defer file.Close()
	rootDir := configs.ApplicationConfig.ImgUri
	fileDir := fmt.Sprintf("/uploads/images/%s/", time.Now().Format("200601"))
	_, err = os.Stat(rootDir + fileDir)
	if err != nil {
		if !os.IsExist(err) { // 目录不存在,创建目录
			err = os.MkdirAll(rootDir+fileDir, os.ModePerm)
			if err != nil {
				fmt.Println(err)
				return returnPdf, err
			}
		}
	}
	//文件重命名
	fileName := strconv.FormatInt(time.Now().Unix(), 10) + strconv.Itoa(rand.Intn(999999-100000)+100000) + path.Ext(header.Filename)
	filePath := rootDir + fileDir

	// 创建保存路径
	savePath := filepath.Join(filePath, fileName)
	out, err := os.Create(savePath)
	if err != nil {
		return returnPdf, err
	}
	defer out.Close()

	// 分块上传
	buffer := make([]byte, 1024*1024) // 1MB 缓冲区
	for {
		n, err := file.Read(buffer)
		if err != nil && err != io.EOF {
			return returnPdf, err
		}
		if n == 0 {
			break
		}

		_, err = out.Write(buffer[:n])
		if err != nil {
			return returnPdf, err
		}
	}
	returnPdf.Url=fileDir + fileName
	returnPdf.Name=fileName
	returnPdf.Path=savePath
	return returnPdf ,nil

}

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!