不废话 上代码
controller层:
func DownloadFileHandler(c *gin.Context) {
taskid := c.Query("taskid")
fmt.Println(taskid)
id, err := strconv.Atoi(taskid)
if err != nil {
}
err, data := logic.Downloadfile(id)
if err != nil {
}
fmt.Println(len(data))
// 设置返回头并返回数据
c.Header("Content-Type", "application/octet-stream")
c.Header("Content-Disposition", "attachement;filename=\""+"你的文件名.jpg"+"\"")
c.Data(http.StatusOK, "application/octet-stream", data)
}
logic层:
在转化[]byte 这块思路一直有点乱。
方法也很多,这里总结了四种方法去返回[]byte数据
func Downloadfile(taskid int) (err error, data []byte) {
ctx := context.Background()
filenames, err := mysql.FindTaskFileName(taskid)
if err != nil {
return err, nil
}
fmt.Println(filenames)
object, err := miniocli.MinIOClient.GetObject(ctx, miniocli.BucketPicture, filenames[0], minio.GetObjectOptions{})
if err != nil {
logger.Lg.Error("MinIOClient.GetObject failed ...", zap.Error(err))
return err, nil
}
fmt.Printf("object:%v\n", object)
//方法1⃣️:
//bowl := bytes.Buffer{}
//num, err := bowl.ReadFrom(object)
//fmt.Println(num)
//return nil, bowl.Bytes()
//方法2⃣️:
//var chunk []byte
//buf := make([]byte, 1024)
//for {
// //从file读取到buf中
// //Read reads up to len(b) bytes into b.
// //It returns the number of bytes read (0 <= n <= len(b)) and any error encountered.
// //Returns io.EOF upon end of file.
// n, err := object.Read(buf)
// if err != nil && err != io.EOF {
// fmt.Println("read buf fail", err)
// return err, nil
// }
// //说明读取结束
// if n == 0 {
// fmt.Println("n=0")
// break
// }
// //读取到最终的缓冲区中
// chunk = append(chunk, buf[:n]...)
//}
//方法3⃣️:
//r := bufio.NewReader(object)
//var chunk []byte
//
//buf := make([]byte, 1024)
//
//for {
// n, err := r.Read(buf)
// if err != nil && err != io.EOF {
// panic(err)
// }
// if 0 == n {
// break
// }
// //fmt.Println(string(buf))
// chunk = append(chunk, buf...)
//}
//方法4⃣️:
chunk, err := ioutil.ReadAll(object)
if err != nil {
fmt.Println("read to fd fail", err)
return err, nil
}
return nil, chunk