go文件上传断点续传功能

go断点续传功能

断点续传功能,减少服务器文件重复存储. 提升上传响应速度
使用两种思路进行续传功能
注意: 文件使用文件名称进行唯一文件进行判断, 不具有文件唯一性.如果使用于生产环境. 需要处理文件上传文件名称问题

思路1:

思路1: 使用零时文件记录中断位置.
1.文件上传时,先创建上传一个新的文件
2.创建记录中断位置的临时文件
3.设置文件读写偏移量
4.上传完成后,删除临时文件

func upload1(r *http.Request) (int,error) {
	// 获取上传文件
	upfile, fileHeader, err := r.FormFile("file")
	if err != nil {
		return 0, errors.New("上传文件错误")
	}
	headerByte, _ := json.Marshal(fileHeader.Header)
	log.Printf("当前文件:Filename - >{%s}, Size -> {%v}, FileHeader -> {%s}", fileHeader.Filename, fileHeader.Size, string(headerByte))

	// 新文件创建
	filePath := "./" + fileHeader.Filename
	fileBool, err := isFileExists(filePath)
	if fileBool && err == nil {
		fmt.Println("文件已存在")
	} else {
		newfile, err := os.Create(filePath)
		defer newfile.Close()
		if err != nil {
			return 0, errors.New("创建文件失败")
		}
	}
	// 上传文件开始位置
	start := "0"
	// 查询本地是否有断点记录
	var breakPointFile *os.File
	breakPointFilePath := filePath + ".txt"
	breakPointFileBool, err := isFileExists(breakPointFilePath)

	// 如果文件存在 但断点记录不存在  则文件已上传
	if fileBool && !breakPointFileBool {
		return 0, errors.New("文件已存在, 不继续上传")
	}

	//fmt.Println("断点文件检测:", breakPointFileBool,err)
	if breakPointFileBool && err == nil {
		// 读取断点位置
		breakPointFile, err = os.OpenFile(breakPointFilePath,os.O_CREATE|os.O_RDWR,os.ModePerm)
		defer breakPointFile.Close()
		if err != nil {
			return 0, errors.New("断点文件打开失败")
		}
		res, _ := ioutil.ReadAll(breakPointFile)
		fmt.Println("断点文件写入字段长度:",string(res))
		start = string(res)
	} else {
		// 创建断点文件
		breakPointFile ,err = os.Create(breakPointFilePath)
		defer breakPointFile.Close()
		if err != nil {
			return 0, errors.New("断点文件创建失败")
		}
		len, err := breakPointFile.WriteString("0")
		if len <= 0 || err != nil {
			return 0, errors.New("
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值