go web 生成二維碼
阿新 • • 發佈:2018-12-14
go web 生成二維碼 時間有限寫的比較簡陋 拋磚引玉
package main
import (
"bytes"
bs "encoding/base64"
"fmt"
"image"
"image/png"
"log"
"net/http"
"github.com/boombuler/barcode"
"github.com/boombuler/barcode/qr"
)
func makeqrcode(base641 string) image.Image {
log.Println("Original data:", base641)
code, err := qr.Encode(base641, qr.L, qr.Unicode)
// code, err := code39.Encode(base64)
if err != nil {
log.Fatal(err)
}
if base641 != code.Content() {
log.Fatal("data differs")
}
code, err = barcode.Scale(code, 300, 300)
if err != nil {
log.Fatal(err)
}
return code
}
func main() {
http.HandleFunc("/", qrcode) //設定訪問的路由
err1 := http.ListenAndServe(":80", nil)
if err1 != nil {
log.Fatal("ListenAndServe:", err1)
}
}
func qrcode(w http.ResponseWriter, req *http.Request) {
req.ParseForm()
param, _ := req.Form["str"]
if param == nil {
fmt.Printf("1a")
http.Redirect(w, req, "/?str=", http.StatusFound)
} else {
base641 := param[0]
img := makeqrcode(base641)
emptyBuff := bytes.NewBuffer([]byte{}) //開闢一個新的空buff
png.Encode(emptyBuff, img) //img寫入到buff
dist := make([]byte, 50000) //開闢儲存空間
bs.StdEncoding.Encode(dist, emptyBuff.Bytes()) //buff轉成base64
n := 0
for i := 0; i < len(dist); i++ {
if dist[i] == 0 {
n = i
break
}
}
str := string(dist[:n])
fmt.Println(str)
fmt.Println(len(str))
ls1 := "<!DOCTYPE html><head><meta charset='utf-8' /></head><body><img src='data:image/png;base64,"
ls2 := "'/></body></html>"
ls := ls1 + str + ls2
fmt.Fprintf(w, ls)
}
}