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
+5.3k Golang : Count number of runes in string
+2.6k Golang : How to remove certain lines from a file
+10.7k Golang : Read directory content with os.Open
+6.4k Golang : How to unmarshal JSON inner/nested value and assign to specific struct?
+1.7k Golang : Check if a word is countable or not
+2.7k Golang : Muxing with Martini example
+2.5k Python : Convert(cast) string to bytes example
+3.6k Golang : Format strings to SEO friendly URL example
+4.6k Golang : Arithmetic operation with numerical slices or arrays example
+1.7k Linux : How to fix Brother HL-1110 printing blank page problem
+3.7k Golang : Load ASN1 encoded DSA public key PEM file example
+2.3k Golang : Capture text return from exec function example