wails-app-dock/pkg/server/controller/file.go
2024-02-17 21:45:43 +08:00

89 lines
2.0 KiB
Go

package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
"os"
"path/filepath"
"skapp/pkg/logger"
"skapp/pkg/utils/errorx"
"skapp/pkg/utils/response"
)
type GetPathDto struct {
// 路径
Path string `form:"path" binding:"required" example:"C:\\Windows\\System32\\cmd.exe"`
}
type GetFileDto struct {
// 路径
Path string `form:"path" binding:"required" example:"C:\\Windows\\System32\\cmd.exe"`
// 偏移量
Offset int64 `form:"offset"`
// 区块大小
ChunkSize int64 `form:"chunkSize"`
}
// GetPath
// @Summary 获取文件路径
// @Description 获取文件路径
// @Tags File
// @Accept json
// @Produce json
// @Param vo query controller.GetPathDto true "获取文件路径"
// @Success 200 {object} response.Response{data=string}
// @Failure default {object} errorx.CodeErrorResponse
// @Router /file/path [get]
func GetPath(ctx *gin.Context) {
dto := &GetPathDto{}
err := ctx.ShouldBindQuery(dto)
if err = errorx.ParseError(err); err != nil {
logger.Log.Errorln(err)
ctx.JSON(200, err)
}
logger.Log.Infof("%+v", dto)
absPath, _ := filepath.Abs(dto.Path)
ctx.JSON(200, response.NewResponse(absPath))
}
// GetFile
// @Summary 获取文件
// @Description 获取文件
// @Tags File
// @Accept json
// @Produce octet-stream
// @Param vo query controller.GetFileDto true "获取文件"
// @Router /file/ [get]
func GetFile(ctx *gin.Context) {
dto := &GetFileDto{}
err := ctx.BindQuery(dto)
if err != nil {
ctx.Status(http.StatusInternalServerError)
logger.Log.Errorln(err)
return
}
offset := dto.Offset
chunkSize := dto.ChunkSize
p, _ := filepath.Abs(dto.Path)
info, err := os.Stat(p)
if err != nil || info.IsDir() {
ctx.Status(http.StatusNotFound)
return
}
if offset == 0 && chunkSize == 0 {
ctx.File(p)
return
} else {
w := ctx.Writer
ctx.Request.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", offset, offset+chunkSize))
logger.Log.Debugf("%s", ctx.Request.Header.Get("Range"))
http.ServeFile(w, ctx.Request, p)
return
}
}