file_decoder.go 908 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package service
  2. import (
  3. "encoding/base64"
  4. "fmt"
  5. "io"
  6. "one-api/constant"
  7. "one-api/dto"
  8. )
  9. var maxFileSize = constant.MaxFileDownloadMB * 1024 * 1024
  10. func GetFileBase64FromUrl(url string) (*dto.LocalFileData, error) {
  11. resp, err := DoDownloadRequest(url)
  12. if err != nil {
  13. return nil, err
  14. }
  15. defer resp.Body.Close()
  16. // Always use LimitReader to prevent oversized downloads
  17. fileBytes, err := io.ReadAll(io.LimitReader(resp.Body, int64(maxFileSize+1)))
  18. if err != nil {
  19. return nil, err
  20. }
  21. // Check actual size after reading
  22. if len(fileBytes) > maxFileSize {
  23. return nil, fmt.Errorf("file size exceeds maximum allowed size: %dMB", constant.MaxFileDownloadMB)
  24. }
  25. // Convert to base64
  26. base64Data := base64.StdEncoding.EncodeToString(fileBytes)
  27. return &dto.LocalFileData{
  28. Base64Data: base64Data,
  29. MimeType: resp.Header.Get("Content-Type"),
  30. Size: int64(len(fileBytes)),
  31. }, nil
  32. }