完成了分享下载全部流程

This commit is contained in:
2024-10-12 13:37:49 +08:00
parent e6f5aaa02f
commit 7862b1d88e
11 changed files with 342 additions and 30 deletions
+80 -1
View File
@@ -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
}