gin 大文件上传

开始解析文件

   var reg_name = regexp.MustCompile(`filename="(.+)"`)
func fileinfo(c *gin.Context) (filename string, flag []byte, rd *bufio.Reader) {
	rd = bufio.NewReader(c.Request.Body)
	line, _ := rd.ReadBytes('\n')
	flag = line[0 : len(line)-2] //开始结束标记

	line, _ = rd.ReadBytes('\n')

	filenames := reg_name.FindStringSubmatch(string(line))//正则解析文件名
	filename = filenames[1]
	//Content-Disposition: form-data; name="file"; filename="上传文件名.txt"

	rd.ReadBytes('\n') //文件类型

	rd.ReadBytes('\n') //跳过换行符
	return
}  

开始写入文件流

func savefile(buf *bufio.Reader, flag []byte, src string) error {

	f, err := os.OpenFile(src, os.O_WRONLY|os.O_APPEND|os.O_CREATE|os.O_EXCL, os.ModePerm) //创建文件
	if err != nil {
		return err
	}

	defer f.Close()

	buf_b := make([]byte, 1024*8)

	for {

		n, _ := buf.Read(buf_b)
		if z := bytes.Index(buf_b, flag); z >= 0 { //判断结束标记
			f.Write(buf_b[:z-2])
			f.Sync()
			break
		}
		f.Write(buf_b[:n])
		if n <= 0 {
			break
		}
	}
	return nil
}

  

posted @ 2020-05-20 21:57  一大二王里  阅读(1216)  评论(0编辑  收藏  举报