package system import ( "context" "github.com/gin-gonic/gin" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "io/ioutil" "net/http" "os" "path" "path/filepath" "server/global" "server/model/common/request" "server/model/common/response" "server/model/system" systemReq "server/model/system/request" proto "server/proto" "server/utils" "strconv" "strings" "time" ) type FileApi struct{} func (b *FileApi) GetFileList(c *gin.Context) { var search systemReq.SearchAppFileParams err := c.ShouldBindJSON(&search) if err != nil { response.FailWithMessage(err.Error(), c) return } err = utils.Verify(search.PageInfo, utils.PageInfoVerify) if err != nil { response.FailWithMessage(err.Error(), c) return } list, total, err := fileService.GetFileInfoList(search) if err != nil { global.GVA_LOG.Error("获取失败!", zap.Error(err)) response.FailWithMessage("获取失败", c) return } response.OkWithDetailed(response.PageResult{ List: list, Total: total, Page: search.PageInfo.Page, PageSize: search.PageInfo.PageSize, }, "获取成功", c) } func (b *FileApi) Upload(c *gin.Context) { id := utils.GetUserID(c) // 获取表单字段的值 categoryName := c.PostForm("categoryName") str := c.PostForm("authId") iv := c.PostForm("iv") authId := strings.Replace(str, ",", "", -1) // 获取上传的文件 file, err := c.FormFile("file") if err != nil { global.GVA_LOG.Error("获取文件数据失败", zap.Error(err)) response.FailWithMessage("获取文件数据失败", c) return } //获取后缀 sufx := path.Ext(file.Filename) //利用时间戳生成文件名 fileNameInt := time.Now().Unix() fileNameStr := strconv.FormatInt(fileNameInt, 10) //新的文件名 newfileName := fileNameStr + sufx currentDir, _ := os.Getwd() parentDir := filepath.Dir(currentDir) folderPath := filepath.Join(parentDir, "uploadfiles") _, err = os.Stat(folderPath) if os.IsNotExist(err) { os.Mkdir(folderPath, os.ModePerm) } //保存文件 filePath := filepath.Join(folderPath, "/", newfileName) c.SaveUploadedFile(file, filePath) savePath := "/uploadfiles/" + newfileName currentTimeValue := time.Now() err = fileService.Upload(system.File{ OriginalName: strings.TrimSuffix(file.Filename, filepath.Ext(file.Filename)), EncryptedName: file.Filename, SavePath: savePath, CategoryName: categoryName, AuthId: authId, SuffixName: path.Ext(file.Filename), UploadTime: ¤tTimeValue, Uploader: int(id), Icon: strings.TrimPrefix(path.Ext(file.Filename), ".") + ".png", Iv: iv, }) if err != nil { global.GVA_LOG.Error("上传失败!", zap.Error(err)) response.FailWithMessage(err.Error(), c) return } response.OkWithMessage("上传成功", c) } func (b *FileApi) SetFileInfo(c *gin.Context) { var file systemReq.ChangeFileInfo err := c.ShouldBindJSON(&file) if err != nil { response.FailWithMessage(err.Error(), c) return } err = utils.Verify(file, utils.IdVerify) if err != nil { response.FailWithMessage(err.Error(), c) return } // 将整数数组转换为字符串切片 var result string for _, v := range file.AuthId { result += strconv.Itoa(v) } err = fileService.SetFileInfo(system.File{ ID: file.ID, CategoryName: file.CategoryName, AuthId: result, }) if err != nil { global.GVA_LOG.Error("设置失败!", zap.Error(err)) response.FailWithMessage("设置失败", c) return } response.OkWithMessage("设置成功", c) } func (b *FileApi) DeleteBaseFile(c *gin.Context) { var reqId request.GetById err := c.ShouldBindJSON(&reqId) if err != nil { response.FailWithMessage(err.Error(), c) return } err = utils.Verify(reqId, utils.IdVerify) if err != nil { response.FailWithMessage(err.Error(), c) return } err = fileService.DeleteFile(reqId.ID) if err != nil { global.GVA_LOG.Error("删除失败!", zap.Error(err)) response.FailWithMessage(err.Error(), c) return } response.OkWithMessage("删除成功", c) } func (b *FileApi) Distribute(c *gin.Context) { id := utils.GetUserID(c) var file systemReq.Distribute err := c.ShouldBindJSON(&file) if err != nil { response.FailWithMessage(err.Error(), c) return } err = utils.Verify(file, utils.IdVerify) if err != nil { response.FailWithMessage(err.Error(), c) return } users, err := deptService.GetDeptsUsers(file.Depts) if err != nil { global.GVA_LOG.Error("操作失败!", zap.Error(err)) response.FailWithMessage(err.Error(), c) return } var userFile []systemReq.UserFile var usersId []int64 for _, user := range users { userFile = append(userFile, systemReq.UserFile{ Operator: int(id), Receiver: int(user.ID), FileId: file.ID, EffectiveDate: file.EfectiveDate, OperationStatus: "下发", IsDeleted: 0, }) usersId = append(usersId, int64(user.ID)) } err = fileService.Distribute(userFile) if err != nil { global.GVA_LOG.Error("下发失败!", zap.Error(err)) response.FailWithMessage(err.Error(), c) return } //下发消息 conn, err := grpc.Dial("127.0.0.1:9090", grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { global.GVA_LOG.Error("grpc远程连接错误!", zap.Error(err)) response.FailWithMessage(err.Error(), c) } defer conn.Close() //建立连接 client := proto.NewSendMessageClient(conn) resp, err := client.Distribution(context.Background(), &proto.DistributionRequest{Users: usersId}) if resp.GetCode() != 200 && err != nil { global.GVA_LOG.Error("消息通知失败!", zap.Error(err)) response.FailWithMessage(err.Error(), c) } response.OkWithMessage("下发成功", c) } func (b *FileApi) View(c *gin.Context) { var reqId request.GetById err := c.ShouldBindJSON(&reqId) if err != nil { response.FailWithMessage(err.Error(), c) return } file, err := fileService.View(reqId.ID) if err != nil { global.GVA_LOG.Error("查找失败!", zap.Error(err)) response.FailWithMessage(err.Error(), c) return } currentDir, _ := os.Getwd() parentDir := filepath.Dir(currentDir) data, _ := ioutil.ReadFile(parentDir + file.SavePath) c.Data(http.StatusOK, "application/octet-stream", data) response.OkWithMessage("查看成功", c) }