当一个图像不存在时,我会动态创建一个图像。请求时,IE example_t500.jpg将从example.jpg创建。我遇到的问题是在显示丢失图像之前请求显示创建的图像。
代码:
package main
import (
"image/jpeg"
"net/http"
"log"
"os"
"strings"
"fmt"
"strconv"
resizer "github.com/nfnt/resize"
)
func WebHandler (w http.ResponseWriter, r *http.Request) {
var Path = "../../static/img/photos/2014/11/4/test.jpg"
ResizeImage(Path, 500)
http.Handle("/", http.FileServer(http.Dir("example_t500.jpg")))
}
func ResizeImage (Path string, Width uint) {
var ImageExtension = strings.Split(Path, ".jpg")
var ImageNum = strings.Split(ImageExtension[0], "/")
var ImageName = ImageNum[len(ImageNum)-1]
fmt.Println(ImageName)
file, err := os.Open(Path)
if err != nil {
log.Fatal(err)
}
img, err := jpeg.Decode(file)
if err != nil {
log.Fatal(err)
}
file.Close()
m := resizer.Resize(Width, 0, img, resizer.Lanczos3)
out, err := os.Create(ImageName + "_t" + strconv.Itoa(int(Width)) + ".jpg")
if err != nil {
log.Fatal(err)
}
defer out.Close()
jpeg.Encode(out, m, nil)
}
func main() {
http.HandleFunc("/", WebHandler)
http.ListenAndServe(":8080", nil)
}
这是我第一次尝试使用Go而无法渲染图像。任何帮助表示赞赏。
答案 0 :(得分:12)
您需要做一些事情。
首先,您需要从WebHandler
函数中删除此行:
http.Handle("/", http.FileServer(http.Dir("example_t500.jpg")))
设置默认服务mux来处理根路由 - 但您已经在main
函数中完成了此操作:
http.HandleFunc("/", WebHandler)
因此,每当您点击根路线时,您实际上只是告诉servemux再次处理它......但不同。
你想要做什么..设置响应的Content-Type
标题..然后将文件的内容复制到响应流。像这样:
func WebHandler (w http.ResponseWriter, r *http.Request) {
var Path = "../../static/img/photos/2014/11/4/test.jpg"
ResizeImage(Path, 500)
img, err := os.Open("example_t500.jpg")
if err != nil {
log.Fatal(err) // perhaps handle this nicer
}
defer img.Close()
w.Header().Set("Content-Type", "image/jpeg") // <-- set the content-type header
io.Copy(w, img)
}
这是手动版本。还有http.ServeFile。
编辑:
回复您的评论 - 如果您根本不想编写文件并仅动态投放,那么您需要做的就是将http.ResponseWriter
传递给Encode
方法。 jpeg.Encode
需要io.Writer
..就像io.Copy
在原始示例中所做的那样:
// Pass in the ResponseWriter
func ResizeImage (w io.Writer, Path string, Width uint) {
var ImageExtension = strings.Split(Path, ".jpg")
var ImageNum = strings.Split(ImageExtension[0], "/")
var ImageName = ImageNum[len(ImageNum)-1]
fmt.Println(ImageName)
file, err := os.Open(Path)
if err != nil {
log.Fatal(err)
}
img, err := jpeg.Decode(file)
if err != nil {
log.Fatal(err)
}
file.Close()
m := resizer.Resize(Width, 0, img, resizer.Lanczos3)
// Don't write the file..
/*out, err := os.Create(ImageName + "_t" + strconv.Itoa(int(Width)) + ".jpg")
if err != nil {
log.Fatal(err)
}
defer out.Close()*/
jpeg.Encode(w, m, nil) // Write to the ResponseWriter
}
接受方法中的io.Writer
..然后将其编码为。然后,您可以像这样调用您的方法:
func WebHandler (w http.ResponseWriter, r *http.Request) {
var Path = "../../static/img/photos/2014/11/4/test.jpg"
ResizeImage(w, Path, 500) // pass the ResponseWriter in
}
答案 1 :(得分:0)
您正在寻找的功能是http.ServeFile。在代码中使用它而不是http.Handle。