94 lines
2.6 KiB
Go
94 lines
2.6 KiB
Go
package video_server
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"mime/multipart"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"FireLeave_tool/logger"
|
|
)
|
|
|
|
// UploadToNginx 上传视频到 Nginx 服务器,返回 URL
|
|
func UploadToNginx(filePath string, eventParams map[string]any, uploadURL string) (string, error) {
|
|
|
|
file, err := os.Open(filePath)
|
|
if err != nil {
|
|
return "", fmt.Errorf("open file failed: %w", err)
|
|
}
|
|
defer file.Close()
|
|
|
|
body := new(bytes.Buffer)
|
|
writer := multipart.NewWriter(body)
|
|
|
|
part, err := writer.CreateFormFile("file", filepath.Base(filePath))
|
|
if err != nil {
|
|
return "", fmt.Errorf("create form file failed: %w", err)
|
|
}
|
|
if _, err = io.Copy(part, file); err != nil {
|
|
return "", fmt.Errorf("copy file failed: %w", err)
|
|
}
|
|
|
|
eventJSON, err := json.Marshal(eventParams)
|
|
if err != nil {
|
|
return "", fmt.Errorf("marshal event failed: %w", err)
|
|
}
|
|
logger.Logger.Printf("[Upload Event parameters]eventParams: %v", eventParams)
|
|
logger.Logger.Printf("[Upload Event parameters]eventJSON: %s", string(eventJSON))
|
|
|
|
if err := writer.WriteField("event", string(eventJSON)); err != nil {
|
|
return "", fmt.Errorf("write event field failed: %w", err)
|
|
}
|
|
|
|
if err := writer.Close(); err != nil {
|
|
return "", fmt.Errorf("close writer failed: %w", err)
|
|
}
|
|
|
|
logger.Logger.Printf("[HTTP Request]URL: %s", uploadURL)
|
|
logger.Logger.Printf("[HTTP Request]Content-Type: %s", writer.FormDataContentType())
|
|
logger.Logger.Printf("[HTTP Request]Body 长度: %d bytes", body.Len())
|
|
|
|
req, err := http.NewRequest("POST", uploadURL, body)
|
|
if err != nil {
|
|
return "", fmt.Errorf("create request failed: %w", err)
|
|
}
|
|
req.Header.Set("Content-Type", writer.FormDataContentType())
|
|
|
|
client := &http.Client{Timeout: 180 * time.Second}
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
return "", fmt.Errorf("upload failed: %w", err)
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
respBody, _ := io.ReadAll(resp.Body)
|
|
logger.Logger.Printf("[nginx response]Status: %d", resp.StatusCode)
|
|
logger.Logger.Printf("[nginx response]Body: %s", string(respBody))
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
return "", fmt.Errorf("nginx error %d: %s", resp.StatusCode, string(respBody))
|
|
}
|
|
|
|
var result struct {
|
|
Code int `json:"code"`
|
|
Result json.RawMessage `json:"result"`
|
|
}
|
|
if err := json.Unmarshal(respBody, &result); err != nil {
|
|
return "", fmt.Errorf("parse response failed: %w", err)
|
|
}
|
|
if result.Code != 0 {
|
|
return "", fmt.Errorf("nginx error: %s", string(respBody))
|
|
}
|
|
|
|
var videoURL string
|
|
json.Unmarshal(result.Result, &videoURL)
|
|
|
|
logger.Logger.Printf("[ Upload Successful ] Local file: %s → Remote URL: %s", filePath, videoURL)
|
|
return videoURL, nil
|
|
}
|