package download import ( "fmt" "io" "net/http" "os" "time" "fyne.io/fyne/v2/widget" ) func WithProgressBar(downloadURL, filePath string, progressBar *widget.ProgressBar) error { client := &http.Client{ Timeout: 15 * time.Minute, } resp, err := client.Get(downloadURL) if err != nil { return fmt.Errorf("download failed: %v", err) } defer resp.Body.Close() file, err := os.Create(filePath) if err != nil { return fmt.Errorf("unable to create file: %v", err) } defer file.Close() contentLength := resp.ContentLength if contentLength <= 0 { return fmt.Errorf("invalid content length") } progressBar.Max = float64(contentLength) buffer := make([]byte, 4096) var totalBytes int64 for { n, readErr := resp.Body.Read(buffer) if n > 0 { totalBytes += int64(n) progressBar.SetValue(float64(totalBytes)) if _, writeErr := file.Write(buffer[:n]); writeErr != nil { return fmt.Errorf("error writing to file: %v", writeErr) } } if readErr == io.EOF { break } if readErr != nil { return fmt.Errorf("download aborted: %v", readErr) } } return nil }