package file_export import ( "encoding/json" "net/http" "os" "path/filepath" "nms_cxy/lib/file" "nms_cxy/lib/log" "nms_cxy/lib/services" "nms_cxy/src/framework/datasource" "nms_cxy/src/framework/i18n" "nms_cxy/src/framework/utils/ctx" "github.com/gin-gonic/gin" ) type SysJobResponse struct { SysJob TableName string `json:"tableName"` TableDisplay string `json:"tableDisplay"` FilePath string `json:"filePath"` } type TargetParams struct { Duration int `json:"duration"` TableName string `json:"tableName"` Columns string `json:"columns"` // exported column name of time string TimeCol string `json:"timeCol"` // time stamp of column name TimeUnit string `json:"timeUnit"` // timestamp unit: second/micro/milli Extras string `json:"extras"` // extras condition for where FilePath string `json:"filePath"` // file path } func (m *SysJob) GetFileExportTable(c *gin.Context) { var results []SysJob err := datasource.DefaultDB().Table(m.TableName()).Where("invoke_target=? and status=1", INVOKE_FILE_EXPORT). Find(&results).Error if err != nil { c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return } language := ctx.AcceptLanguage(c) var response []SysJobResponse for _, job := range results { var params TargetParams if err := json.Unmarshal([]byte(job.TargetParams), ¶ms); err != nil { c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return } TableDisplay := i18n.TKey(language, "table."+params.TableName) if TableDisplay == "" { TableDisplay = params.TableName } response = append(response, SysJobResponse{ SysJob: job, TableName: params.TableName, TableDisplay: TableDisplay, FilePath: params.FilePath, }) } c.JSON(http.StatusOK, services.DataResp(response)) } func (m *FileExport) GetFileList(c *gin.Context) { var querys FileExportQuery if err := c.ShouldBindQuery(&querys); err != nil { c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) return } files, err := file.GetFileInfo(querys.Path, querys.Suffix) if err != nil { log.Error(err) c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) } // split files list lenNum := int64(len(files)) start := (querys.PageNum - 1) * querys.PageSize end := start + querys.PageSize var splitList []file.FileInfo if start >= lenNum { splitList = []file.FileInfo{} } else if end >= lenNum { splitList = files[start:] } else { splitList = files[start:end] } total := len(files) c.JSON(http.StatusOK, services.TotalDataResp(splitList, total)) } func (m *FileExport) Total(c *gin.Context) { dir := c.Query("path") fileCount, dirCount, err := file.GetFileAndDirCount(dir) if err != nil { log.Error(err) c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return } total := fileCount + dirCount c.JSON(http.StatusOK, services.TotalResp(int64(total))) } func (m *FileExport) DownloadHandler(c *gin.Context) { dir := c.Query("path") fileName := c.Param("fileName") filePath := filepath.Join(dir, fileName) file, err := os.Open(filePath) if err != nil { c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return } defer file.Close() if _, err := os.Stat(filePath); os.IsNotExist(err) { c.JSON(http.StatusNotFound, services.ErrResp(err.Error())) return } c.Header("Content-Disposition", "attachment; filename="+fileName) c.Header("Content-Type", "application/octet-stream") c.File(filePath) } func (m *FileExport) Delete(c *gin.Context) { fileName := c.Param("fileName") dir := c.Query("path") filePath := filepath.Join(dir, fileName) if err := os.Remove(filePath); err != nil { c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return } c.JSON(http.StatusNoContent, nil) // 204 No Content }