package iot_excelize import ( "context" "fmt" "io" "strings" "time" "git.5iot.com/iotlcm-public/iotlcm-app/internal/consts" "git.5iot.com/iotlcm-public/iotlcm-app/internal/model" "git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity" "git.5iot.com/iotlcm-public/iotlcm-app/internal/service" "git.5iot.com/iotlcm-public/iotlcm-app/utility/uuid32" "github.com/xuri/excelize/v2" ) // SaveLocal saves an Excel workbook through SysOss local storage and records it // in the sys_oss table. func SaveLocal(ctx context.Context, f *excelize.File, fileName string, category string) (*entity.SysOss, error) { if category == "" { category = "export" } category = safePathName(category) if fileName == "" { fileName = "excel" } fileName = uniqueExcelFileName(fileName) reader, err := ToReadSeeker(f) if err != nil { return nil, err } if _, err = reader.Seek(0, io.SeekStart); err != nil { return nil, err } content, err := io.ReadAll(reader) if err != nil { return nil, err } result, err := service.SysOss().SaveContent(ctx, &model.SysOssSaveContentParam{ Content: content, FileName: fileName, NewFileType: consts.SysUploadNewFileTypeUserFile, SubDirName: "excel/" + category, NotAddDate: 0, }) if err != nil { return nil, err } if result == nil { return nil, nil } return result.SysOss, nil } func safeExcelFileName(fileName string) string { fileName = strings.TrimSpace(fileName) if fileName == "" { fileName = "excel" } fileName = strings.TrimSuffix(fileName, ".xlsx") for _, old := range []string{"\\", "/", ":", "*", "?", "\"", "<", ">", "|"} { fileName = strings.ReplaceAll(fileName, old, "_") } return fileName + ".xlsx" } func uniqueExcelFileName(fileName string) string { fileName = strings.TrimSuffix(safeExcelFileName(fileName), ".xlsx") uid := uuid32.S() if len(uid) > 8 { uid = uid[:8] } return fmt.Sprintf("%s_%s_%s.xlsx", time.Now().Format("20060102150405000"), uid, fileName) } func safePathName(name string) string { name = strings.TrimSpace(name) if name == "" { return "export" } for _, old := range []string{"\\", "/", ":", "*", "?", "\"", "<", ">", "|", "."} { name = strings.ReplaceAll(name, old, "_") } return name }