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
+20.8k Golang : Securing password with salt
+16.9k Golang : Find IP address from string
+4.8k Golang : Error handling methods
+7.3k Golang : Convert word to its plural form example
+9.2k Golang : Allow Cross-Origin Resource Sharing request
+7.4k Golang : Implementing class(object-oriented programming style)
+17.8k Golang : Get RGBA values of each image pixel
+9.2k Golang : Convert file unix timestamp to UTC time example
+4.5k Clean up Visual Studio For Mac installation failed disk full problem
+13.6k Golang : Accurate and reliable decimal calculations
+6.4k Golang : Hue, Saturation and Value(HSV) with OpenCV example