Golang : Progress bar with ∎ character
This tutorial is add on to the previous tutorial on how upload/receive progress indicator. Just a slight modification, where the progress is indicated by ∎ character and % completed.
NOTE : To add % sign after %v, use two % symbols.
Here you go :
package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
"time"
)
const (
barChar = "∎"
)
func uploadPage(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(fmt.Sprintf("<html><title>Go upload</title><body><form action='http://localhost:8080/receive' method='post' enctype='multipart/form-data'><label for='file'>Filename:</label><input type='file' name='file' id='file'><input type='submit' value='Upload' ></form></body></html>")))
}
func uploadProgress(w http.ResponseWriter, r *http.Request) {
mr, err := r.MultipartReader()
if err != nil {
fmt.Fprintln(w, err)
return
}
length := r.ContentLength
//ticker := time.Tick(time.Millisecond) // <-- use this in production
ticker := time.Tick(time.Second) // this is for demo purpose with longer delay
for {
var read int64
var p float32
part, err := mr.NextPart()
if err == io.EOF {
fmt.Printf("\nDone!")
break
}
dst, err := os.OpenFile("upload.jpg", os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
return
}
var barLen int
for {
buffer := make([]byte, 100000)
cBytes, err := part.Read(buffer)
if err == io.EOF {
fmt.Printf("\nLast buffer read!")
break
}
read = read + int64(cBytes)
//fmt.Printf("\r read: %v length : %v \n", read, length)
if read > 0 {
p = float32(read*100) / float32(length)
barLen = int(p)
//fmt.Printf("progress: %v \n", strings.Repeat(barChar,barLen))
<-ticker
fmt.Printf("\rStatus: %v [%v%%]", strings.Repeat(barChar, barLen), p)
//fmt.Printf("\rUploading progress %v", p) // for console
dst.Write(buffer[0:cBytes])
} else {
break
}
}
}
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", uploadPage)
mux.HandleFunc("/receive", uploadProgress)
http.ListenAndServe(":8080", mux)
}
Sample output :
go run uploadprogress.go
Status: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ [99.915634%]
Last buffer read!
See also : Golang : Upload/Receive file progress indicator
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+15.8k Chrome : ERR_INSECURE_RESPONSE and allow Chrome browser to load insecure content
+11k Golang : Sieve of Eratosthenes algorithm
+20.1k Golang : Accept input from user with fmt.Scanf skipped white spaces and how to fix it
+10.2k Golang : Read file and convert content to string
+13k Golang : Add ASCII art to command line application launching process
+7.1k Android Studio : Hello World example
+8.2k Golang : Handle Palindrome string with case sensitivity and unicode
+13.8k Golang : reCAPTCHA example
+9.6k Golang : Generate EAN barcode
+16.3k Golang : How to check if input from os.Args is integer?
+33.9k Golang : How to check if slice or array is empty?
+51.7k Golang : Disable security check for HTTPS(SSL) with bad or expired certificate