allinssl/backend/internal/monitor/file_handle.go

125 lines
2.5 KiB
Go

package monitor
import (
"encoding/csv"
"encoding/json"
"fmt"
"github.com/tealeg/xlsx"
"io"
"mime/multipart"
"path/filepath"
"strings"
)
func ParseMonitorFile(fileHeader *multipart.FileHeader) ([]*Monitor, error) {
ext := strings.ToLower(filepath.Ext(fileHeader.Filename))
file, err := fileHeader.Open()
if err != nil {
return nil, fmt.Errorf("无法打开文件: %v", err)
}
defer file.Close()
switch ext {
case ".csv", ".txt":
return parseCSV(file)
case ".json":
return parseJSON(file)
case ".xlsx":
return parseXLSX(file)
default:
return nil, fmt.Errorf("不支持的文件类型: %s", ext)
}
}
func parseCSV(reader io.Reader) ([]*Monitor, error) {
csvReader := csv.NewReader(reader)
var monitors []*Monitor
isHeader := true
for {
record, err := csvReader.Read()
if err == io.EOF {
break
}
if err != nil {
return nil, fmt.Errorf("CSV 解析失败: %v", err)
}
if isHeader {
isHeader = false
continue
}
if len(record) < 8 {
continue
}
monitor := &Monitor{
Name: record[0],
Target: record[1],
MonitorType: record[2],
ReportTypes: record[3],
Cycle: record[4],
RepeatSendGap: record[5],
Active: record[6],
AdvanceDay: record[7],
}
monitors = append(monitors, monitor)
}
return monitors, nil
}
func parseJSON(reader io.Reader) ([]*Monitor, error) {
var monitors []*Monitor
err := json.NewDecoder(reader).Decode(&monitors)
if err != nil {
return nil, fmt.Errorf("JSON 解析失败: %v", err)
}
return monitors, nil
}
func parseXLSX(file multipart.File) ([]*Monitor, error) {
var monitors []*Monitor
// 读取文件内容到内存
data, err := io.ReadAll(file)
if err != nil {
return nil, err
}
// 解析 XLSX 内容
xlFile, err := xlsx.OpenBinary(data)
if err != nil {
return nil, fmt.Errorf("解析 xlsx 失败: %v", err)
}
if len(xlFile.Sheets) == 0 {
return nil, fmt.Errorf("未找到工作表")
}
sheet := xlFile.Sheets[0]
for i, row := range sheet.Rows {
if i == 0 {
continue // 跳过表头
}
if len(row.Cells) < 8 {
continue
}
monitor := &Monitor{
Name: row.Cells[0].String(),
Target: row.Cells[1].String(),
MonitorType: row.Cells[2].String(),
ReportTypes: row.Cells[3].String(),
Cycle: row.Cells[4].String(),
RepeatSendGap: row.Cells[5].String(),
Active: row.Cells[6].String(),
AdvanceDay: row.Cells[7].String(),
}
monitors = append(monitors, monitor)
}
return monitors, nil
}