完成了分享下载全部流程
This commit is contained in:
+80
-1
@@ -1,10 +1,15 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"archive/zip"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/gin-gonic/gin"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"work_cation/cfg"
|
||||
"work_cation/global"
|
||||
"work_cation/repo"
|
||||
@@ -52,11 +57,35 @@ func (s *serverService) StatusOffline() error {
|
||||
}
|
||||
|
||||
func (s *serverService) StartListenServer() error {
|
||||
router := gin.New()
|
||||
router := gin.Default()
|
||||
router.GET("/user", func(c *gin.Context) {
|
||||
user := repo.User.GetUserInfo(global.DB)
|
||||
c.JSON(200, user)
|
||||
})
|
||||
router.GET("/cards", func(c *gin.Context) {
|
||||
cards := repo.BaseCard.FindAll(global.DB)
|
||||
c.JSON(200, cards)
|
||||
})
|
||||
router.GET("/download/card/:uuid", func(c *gin.Context) {
|
||||
uuid := c.Param("uuid")
|
||||
card := repo.BaseCard.Find(global.DB, uuid)
|
||||
fmt.Println("card:", card)
|
||||
if card.UUID == "" {
|
||||
c.JSON(404, nil)
|
||||
return
|
||||
}
|
||||
cardPath := filepath.Join(cfg.T.CardDir, card.UUID)
|
||||
|
||||
// 设置响应头
|
||||
c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s.zip", uuid))
|
||||
c.Header("Content-Type", "application/zip")
|
||||
|
||||
err := zipFolder(cardPath, c.Writer)
|
||||
if err != nil {
|
||||
c.JSON(500, err)
|
||||
return
|
||||
}
|
||||
})
|
||||
|
||||
srv := &http.Server{
|
||||
Addr: cfg.T.ServerAddr,
|
||||
@@ -71,3 +100,53 @@ func (s *serverService) StartListenServer() error {
|
||||
s.server = srv
|
||||
return nil
|
||||
}
|
||||
|
||||
func zipFolder(folderPath string, zipFile io.Writer) error {
|
||||
zipWriter := zip.NewWriter(zipFile)
|
||||
defer zipWriter.Close()
|
||||
err := filepath.Walk(folderPath, func(filePath string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
header, err := zip.FileInfoHeader(info)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
header.Name, err = filepath.Rel(folderPath, filePath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if info.IsDir() {
|
||||
header.Name += "/"
|
||||
} else {
|
||||
header.Method = zip.Deflate
|
||||
}
|
||||
|
||||
writer, err := zipWriter.CreateHeader(header)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !info.IsDir() {
|
||||
file, err := os.Open(filePath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
_, err = io.Copy(writer, file)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user