implement convert function and simple cache logic

master
DebuggerX 5 years ago
parent a56c59c6e3
commit 7d0e8d6323

1
.gitignore vendored

@ -18,3 +18,4 @@ vendor/
.idea/
cache/

@ -1,48 +1,113 @@
package main
import (
"crypto/md5"
"fmt"
"golang.org/x/image/webp"
"image/jpeg"
"io"
"log"
"net/http"
"os"
"strings"
"time"
)
func main() {
var (
inFile io.Reader
outFile io.Writer
)
_, err := os.Stat("cache")
if err == nil {
err := os.RemoveAll("cache")
if err != nil {
log.Fatal(err)
}
}
err = os.Mkdir("cache", os.ModeDir|os.ModePerm)
if err != nil {
log.Fatal(err)
}
iFile, err := os.OpenFile("/home/debuggerx/Pictures/test.webp", os.O_RDONLY, 0)
http.HandleFunc("/", wepb2jpgHandler)
err = http.ListenAndServe(":9999", nil)
if err != nil {
log.Fatal(err)
}
defer iFile.Close()
inFile = iFile
}
func hitCache(md5Path string, writer http.ResponseWriter) bool {
startTime := time.Now().UnixNano()
_, err := os.Stat("cache/" + md5Path)
if err != nil {
return false
}
oFile, err := os.OpenFile("/home/debuggerx/Pictures/test.jpg", os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.FileMode(0644))
file, err := os.OpenFile("cache/"+md5Path, os.O_RDONLY, os.FileMode(0644))
defer file.Close()
if err != nil {
log.Fatal(err)
}
defer oFile.Close()
outFile = oFile
header := writer.Header()
header.Set("Access-Control-Allow-Origin", "*")
header.Set("content-type", "image/jpeg")
if _, err := io.Copy(writer, file); err != nil {
log.Fatal(err)
}
endTime := time.Now().UnixNano()
fmt.Printf("命中缓存:%dμs\n", (endTime-startTime)/1e3)
return true
}
func wepb2jpg(path string, md5Path string, writer http.ResponseWriter) {
startTime := time.Now().UnixNano()
m, err := webp.Decode(inFile)
resp, getErr := http.Get(path)
if getErr != nil {
log.Fatal(getErr)
}
endTime := time.Now().UnixNano()
fmt.Println((endTime - startTime) / 1e6)
fmt.Printf("下载耗时:%dms\n", (endTime-startTime)/1e6)
startTime = time.Now().UnixNano()
m, err := webp.Decode(resp.Body)
if err != nil {
log.Fatal(err)
}
endTime = time.Now().UnixNano()
fmt.Printf("解码耗时:%dms\n", (endTime-startTime)/1e6)
header := writer.Header()
header.Set("Access-Control-Allow-Origin", "*")
header.Set("content-type", "image/jpeg")
file, err := os.OpenFile("cache/"+md5Path, os.O_CREATE|os.O_WRONLY, os.FileMode(0644))
defer file.Close()
if err != nil {
log.Fatal(err)
}
startTime = time.Now().UnixNano()
err = jpeg.Encode(outFile, m, &jpeg.Options{Quality: 50})
endTime = time.Now().UnixNano()
fmt.Println((endTime - startTime) / 1e6)
err = jpeg.Encode(io.MultiWriter(writer, file), m, &jpeg.Options{Quality: 50})
if err != nil {
log.Fatal(err)
}
endTime = time.Now().UnixNano()
fmt.Printf("编码耗时:%dms\n", (endTime-startTime)/1e6)
}
func wepb2jpgHandler(writer http.ResponseWriter, request *http.Request) {
if !(strings.HasPrefix(request.URL.RawQuery, "http") && strings.HasSuffix(request.URL.RawQuery, ".webp")) {
writer.WriteHeader(404)
return
}
m := md5.Sum([]byte(request.URL.RawQuery))
md5Path := fmt.Sprintf("%x", m)
if hitCache(md5Path, writer) {
return
}
wepb2jpg(request.URL.RawQuery, md5Path, writer)
}

Loading…
Cancel
Save