初始化项目文件
This commit is contained in:
319
api_iris/service/api/file.go
Normal file
319
api_iris/service/api/file.go
Normal file
@ -0,0 +1,319 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/kataras/iris/v12"
|
||||
"github.com/sirupsen/logrus"
|
||||
"main/database"
|
||||
"main/model"
|
||||
"main/utils"
|
||||
"mime/multipart"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func getRootFile(ctx iris.Context) {
|
||||
username := utils.GetLoginUser(ctx)
|
||||
if utils.DataIsNil(username) {
|
||||
return
|
||||
}
|
||||
userPath := fmt.Sprintf("./upload/%s", username.Username)
|
||||
if !utils.FileIsExist(userPath) {
|
||||
err := os.MkdirAll(userPath, 0755)
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
}
|
||||
var files filesRes
|
||||
fileList, err := os.ReadDir(userPath)
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
for _, file := range fileList {
|
||||
if file.IsDir() {
|
||||
files.Dirs = append(files.Dirs, file.Name())
|
||||
} else {
|
||||
var item fileItem
|
||||
item.Name = file.Name()
|
||||
f, err := os.Stat(path.Join(userPath, file.Name()))
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
item.Size = f.Size()
|
||||
item.Type = utils.GetFileType(f.Name())
|
||||
files.Files = append(files.Files, item)
|
||||
}
|
||||
}
|
||||
err = ctx.JSON(utils.FormatRes(iris.StatusOK, "", files))
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 获取指定目录下文件
|
||||
func getFile(ctx iris.Context) {
|
||||
username := utils.GetLoginUser(ctx)
|
||||
if utils.DataIsNil(username) {
|
||||
return
|
||||
}
|
||||
filePath := ctx.Params().Get("path")
|
||||
userPath := fmt.Sprintf("./upload/%s/%s", username.Username, filePath)
|
||||
if !utils.FileIsExist(userPath) {
|
||||
ctx.StatusCode(iris.StatusBadRequest)
|
||||
ctx.SetErr(errors.New(userPath + ":目录不存在"))
|
||||
return
|
||||
}
|
||||
var files filesRes
|
||||
fileList, err := os.ReadDir(userPath)
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
for _, file := range fileList {
|
||||
if file.IsDir() {
|
||||
files.Dirs = append(files.Dirs, file.Name())
|
||||
} else {
|
||||
var item fileItem
|
||||
item.Name = file.Name()
|
||||
f, err := os.Stat(path.Join(userPath, file.Name()))
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
item.Size = f.Size()
|
||||
item.Type = utils.GetFileType(f.Name())
|
||||
files.Files = append(files.Files, item)
|
||||
}
|
||||
}
|
||||
err = ctx.JSON(utils.FormatRes(iris.StatusOK, "", files))
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 删除文件或目录
|
||||
func deleteFile(ctx iris.Context) {
|
||||
username := utils.GetLoginUser(ctx)
|
||||
if utils.DataIsNil(username) {
|
||||
return
|
||||
}
|
||||
filePath := ctx.Params().Get("path")
|
||||
userPath := fmt.Sprintf("./upload/%s/%s", username.Username, filePath)
|
||||
if !utils.FileIsExist(userPath) {
|
||||
ctx.StatusCode(iris.StatusBadRequest)
|
||||
ctx.SetErr(errors.New("目录不存在"))
|
||||
return
|
||||
}
|
||||
if info, _ := os.Stat(userPath); info.IsDir() {
|
||||
err := os.RemoveAll(userPath)
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
err := os.Remove(userPath)
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
}
|
||||
err := ctx.JSON(utils.FormatRes(iris.StatusOK, "", "success"))
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 上传头像
|
||||
func uploadAvatar(ctx iris.Context) {
|
||||
username := utils.GetLoginUser(ctx)
|
||||
if utils.DataIsNil(username) {
|
||||
return
|
||||
}
|
||||
file, info, err := ctx.FormFile("file")
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
defer func(file multipart.File) {
|
||||
err = file.Close()
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
}(file)
|
||||
userPath := fmt.Sprintf("./static/%s", username.Username)
|
||||
if !utils.FileIsExist(userPath) {
|
||||
err = os.MkdirAll(userPath, 0755)
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
}
|
||||
fileType := strings.Split(info.Filename, ".")[len(strings.Split(info.Filename, "."))-1]
|
||||
avatarName := fmt.Sprintf("./static/%s/avatar-%s.%s", username.Username, time.Now().Format("2006-01-02"), fileType)
|
||||
_, err = ctx.SaveFormFile(info, avatarName)
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
err = ctx.JSON(utils.FormatRes(iris.StatusOK, "", avatarName[1:]))
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func uploadDir(ctx iris.Context) {
|
||||
username := utils.GetLoginUser(ctx)
|
||||
if utils.DataIsNil(username) {
|
||||
return
|
||||
}
|
||||
filePath := ctx.Params().Get("path")
|
||||
userPath := fmt.Sprintf("./upload/%s/%s", username.Username, filePath)
|
||||
if utils.FileIsExist(userPath) {
|
||||
ctx.StatusCode(iris.StatusInternalServerError)
|
||||
ctx.SetErr(errors.New("目录已存在"))
|
||||
return
|
||||
}
|
||||
err := os.MkdirAll(userPath, 0755)
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
err = ctx.JSON(utils.FormatRes(iris.StatusOK, "", "success"))
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 上传文件
|
||||
func uploadFile(ctx iris.Context) {
|
||||
username := utils.GetLoginUser(ctx)
|
||||
if utils.DataIsNil(username) {
|
||||
return
|
||||
}
|
||||
filePath := ctx.Params().Get("path")
|
||||
file, info, err := ctx.FormFile("file")
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
defer func(file multipart.File) {
|
||||
err = file.Close()
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
}(file)
|
||||
userPath := fmt.Sprintf("./upload/%s/%s", username.Username, filePath)
|
||||
if !utils.FileIsExist(userPath) {
|
||||
err = os.MkdirAll(userPath, 0755)
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
}
|
||||
_, err = ctx.SaveFormFile(info, fmt.Sprintf("./upload/%s/%s/%s", username.Username, filePath, info.Filename))
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
err = ctx.JSON(utils.FormatRes(iris.StatusOK, "", "success"))
|
||||
if utils.ErrHandle(ctx, err) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 文件下载,转到nginx-upload目录
|
||||
func downloadFile(ctx iris.Context) {
|
||||
authToken := ctx.GetCookie("token")
|
||||
activeTime := time.Now().Add(-2 * time.Hour)
|
||||
var userToken model.JwtKeys
|
||||
db := database.GetInstance().GetMysqlDb()
|
||||
if err := db.Where("token = ? and created_at >= ?", authToken, activeTime).First(&userToken).Error; err != nil {
|
||||
logrus.Errorln("sql执行失败:", err)
|
||||
}
|
||||
if utils.DataIsNil(userToken.Username) {
|
||||
ctx.StatusCode(iris.StatusBadRequest)
|
||||
ctx.SetErr(errors.New("未登录"))
|
||||
return
|
||||
}
|
||||
filePath := ctx.Params().Get("path")
|
||||
userPath := fmt.Sprintf("./upload/%s/%s", userToken.Username, filePath)
|
||||
if !utils.FileIsExist(userPath) {
|
||||
ctx.StatusCode(iris.StatusBadRequest)
|
||||
ctx.SetErr(errors.New("文件不存在"))
|
||||
return
|
||||
}
|
||||
if info, _ := os.Stat(userPath); info.IsDir() {
|
||||
ctx.StatusCode(iris.StatusBadRequest)
|
||||
ctx.SetErr(errors.New("只可下载文件"))
|
||||
return
|
||||
}
|
||||
ctx.Recorder().Header().Add("X-Accel-Redirect", fmt.Sprintf("/upload/%s/%s", userToken.Username, filePath))
|
||||
ctx.Recorder().Header().Add("X-Accel-Charset", "utf-8")
|
||||
ctx.Recorder().Header().Add("Content-Disposition", "attachment")
|
||||
ctx.Recorder().Header().Add("Content-Type", "application/octet-stream; charset=utf-8")
|
||||
return
|
||||
}
|
||||
|
||||
func getDownloadFileType(ctx iris.Context) {
|
||||
authToken := ctx.GetCookie("token")
|
||||
activeTime := time.Now().Add(-2 * time.Hour)
|
||||
var userToken model.JwtKeys
|
||||
var res videoM3u8
|
||||
db := database.GetInstance().GetMysqlDb()
|
||||
if err := db.Where("token = ? and created_at >= ?", authToken, activeTime).First(&userToken).Error; err != nil {
|
||||
logrus.Errorln("sql执行失败:", err)
|
||||
}
|
||||
if utils.DataIsNil(userToken.Username) {
|
||||
ctx.StatusCode(iris.StatusBadRequest)
|
||||
ctx.SetErr(errors.New("未登录"))
|
||||
return
|
||||
}
|
||||
username := userToken.Username
|
||||
filePath := ctx.Params().Get("path")
|
||||
userPath := fmt.Sprintf("./upload/%s/%s", username, filePath)
|
||||
currentPath, _ := filepath.Split(filePath)
|
||||
filename := strings.TrimSuffix(path.Base(userPath), path.Ext(userPath))
|
||||
res.Video = utils.GetFileType(userPath) == "video"
|
||||
res.M3u8 = utils.FileIsExist(fmt.Sprintf("./upload-video/%s/%s%s/%s.m3u8", username, currentPath, filename, filename))
|
||||
err := ctx.JSON(utils.FormatRes(iris.StatusOK, "", res))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func downloadVideo(ctx iris.Context) {
|
||||
authToken := ctx.GetCookie("token")
|
||||
activeTime := time.Now().Add(-2 * time.Hour)
|
||||
var userToken model.JwtKeys
|
||||
db := database.GetInstance().GetMysqlDb()
|
||||
if err := db.Where("token = ? and created_at >= ?", authToken, activeTime).First(&userToken).Error; err != nil {
|
||||
logrus.Errorln("sql执行失败:", err)
|
||||
}
|
||||
if utils.DataIsNil(userToken.Username) {
|
||||
ctx.StatusCode(iris.StatusBadRequest)
|
||||
ctx.SetErr(errors.New("未登录"))
|
||||
return
|
||||
}
|
||||
username := userToken.Username
|
||||
filePath := ctx.Params().Get("path")
|
||||
userPath := fmt.Sprintf("./upload/%s/%s", username, filePath)
|
||||
currentPath, _ := filepath.Split(filePath)
|
||||
filename := strings.TrimSuffix(path.Base(userPath), path.Ext(userPath))
|
||||
//fmt.Println(filePath, currentPath, filename)
|
||||
if path.Ext(userPath) != ".ts" && !utils.FileIsExist(userPath) {
|
||||
ctx.StatusCode(iris.StatusBadRequest)
|
||||
ctx.SetErr(errors.New("文件不存在"))
|
||||
return
|
||||
}
|
||||
if info, err := os.Stat(userPath); err == nil && info.IsDir() {
|
||||
ctx.StatusCode(iris.StatusBadRequest)
|
||||
ctx.SetErr(errors.New("只可下载文件"))
|
||||
return
|
||||
}
|
||||
if utils.GetFileType(userPath) == "video" && utils.FileIsExist(fmt.Sprintf("./upload-video/%s/%s%s/%s.m3u8", username, currentPath, filename, filename)) {
|
||||
ctx.Recorder().Header().Add("X-Accel-Redirect", fmt.Sprintf("/upload-video/%s/%s%s/%s.m3u8", username, currentPath, filename, filename))
|
||||
} else if utils.GetFileType(userPath) == "video" {
|
||||
ctx.Recorder().Header().Add("X-Accel-Redirect", fmt.Sprintf("/upload/%s/%s", username, filePath))
|
||||
} else {
|
||||
tsPath := fmt.Sprintf("./upload-video/%s/%s%s/%s.ts", username, currentPath, filename[:len(filename)-6], filename)
|
||||
ctx.Recorder().Header().Add("X-Accel-Redirect", tsPath[1:])
|
||||
}
|
||||
ctx.Recorder().Header().Add("X-Accel-Charset", "utf-8")
|
||||
ctx.Recorder().Header().Add("Content-Disposition", "attachment")
|
||||
ctx.Recorder().Header().Add("Content-Type", "application/octet-stream; charset=utf-8")
|
||||
return
|
||||
}
|
Reference in New Issue
Block a user