// Copyright (c) 2025 Tethys Plex // // This file is part of Veloera. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . package service import ( "encoding/base64" "fmt" "io" "veloera/constant" "veloera/dto" ) func GetFileBase64FromUrl(url string) (*dto.LocalFileData, error) { var maxFileSize = constant.MaxFileDownloadMB * 1024 * 1024 resp, err := DoDownloadRequest(url) if err != nil { return nil, err } defer resp.Body.Close() // Always use LimitReader to prevent oversized downloads fileBytes, err := io.ReadAll(io.LimitReader(resp.Body, int64(maxFileSize+1))) if err != nil { return nil, err } // Check actual size after reading if len(fileBytes) > maxFileSize { return nil, fmt.Errorf("file size exceeds maximum allowed size: %dMB", constant.MaxFileDownloadMB) } // Convert to base64 base64Data := base64.StdEncoding.EncodeToString(fileBytes) return &dto.LocalFileData{ Base64Data: base64Data, MimeType: resp.Header.Get("Content-Type"), Size: int64(len(fileBytes)), }, nil }