diff --git a/core/utils.go b/core/utils.go index 145a78e..8a8dc97 100644 --- a/core/utils.go +++ b/core/utils.go @@ -3,6 +3,7 @@ package core import ( "bytes" "encoding/json" + "image/gif" "image/jpeg" "image/png" "io/ioutil" @@ -17,6 +18,7 @@ import ( const ( pngHeader = "\x89PNG\r\n\x1a\n" + gifHeader = "GIF" ) func (c *Core) bindBodyJSON(ctx *gin.Context, obj interface{}) error { @@ -101,18 +103,26 @@ func parsePriority(priority string) int { func parseImageContentType(data []byte) string { if len(data) > len(pngHeader) && string(data[:len(pngHeader)]) == pngHeader { return "image/png" + } else if len(data) > len(gifHeader) && string(data[:len(gifHeader)]) == gifHeader { + return "image/gif" } return "image/jpeg" } func createThumbnail(data []byte) *model.Thumbnail { - if parseImageContentType(data) == "image/png" { + switch parseImageContentType(data) { + case "image/png": if cfg, err := png.DecodeConfig(bytes.NewReader(data)); err == nil { return model.NewThumbnail(cfg.Width, cfg.Height) } - } - if cfg, err := jpeg.DecodeConfig(bytes.NewReader(data)); err == nil { - return model.NewThumbnail(cfg.Width, cfg.Height) + case "image/gif": + if cfg, err := gif.DecodeConfig(bytes.NewReader(data)); err == nil { + return model.NewThumbnail(cfg.Width, cfg.Height) + } + default: + if cfg, err := jpeg.DecodeConfig(bytes.NewReader(data)); err == nil { + return model.NewThumbnail(cfg.Width, cfg.Height) + } } return nil } diff --git a/core/utils_test.go b/core/utils_test.go index 0c3b901..efd9b84 100644 --- a/core/utils_test.go +++ b/core/utils_test.go @@ -91,9 +91,14 @@ func TestCreateThumbnail(t *testing.T) { if tb1 == nil { t.Error("Create png thumbnail failed") } - d2, _ := base64.StdEncoding.DecodeString("/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAACAAEDAREAAhEBAxEB/8QAFAABAAAAAAAAAAAAAAAAAAAACP/EABQQAQAAAAAAAAAAAAAAAAAAAAD/xAAVAQEBAAAAAAAAAAAAAAAAAAAHCP/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ABIOllv/2Q==") + d2, _ := base64.StdEncoding.DecodeString("R0lGODlhAQABAPABAAAAAP///yH5BAAAAAAAIf8LSW1hZ2VNYWdpY2sNZ2FtbWE9MC40NTQ1NQAsAAAAAAEAAQAAAgJMAQA7") tb2 := createThumbnail(d2) if tb2 == nil { + t.Error("Create gif thumbnail failed") + } + d3, _ := base64.StdEncoding.DecodeString("/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAACAAEDAREAAhEBAxEB/8QAFAABAAAAAAAAAAAAAAAAAAAACP/EABQQAQAAAAAAAAAAAAAAAAAAAAD/xAAVAQEBAAAAAAAAAAAAAAAAAAAHCP/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ABIOllv/2Q==") + tb3 := createThumbnail(d3) + if tb3 == nil { t.Error("Create jpeg thumbnail failed") } }