imageEditDecodeDataURL 解析 data:image/...;base64,XXXX 形式的 URL。
(url string)
| 981 | |
| 982 | // imageEditDecodeDataURL 解析 data:image/...;base64,XXXX 形式的 URL。 |
| 983 | func imageEditDecodeDataURL(url string) (editImageInput, error) { |
| 984 | comma := strings.Index(url, ",") |
| 985 | if comma < 0 { |
| 986 | return editImageInput{}, fmt.Errorf("invalid data URL") |
| 987 | } |
| 988 | header := url[:comma] |
| 989 | payload := url[comma+1:] |
| 990 | contentType := "image/png" |
| 991 | if semi := strings.Index(header, ";"); semi > 5 { |
| 992 | // 形如 data:image/png;base64 |
| 993 | contentType = header[5:semi] |
| 994 | if !strings.HasPrefix(contentType, "image/") { |
| 995 | return editImageInput{}, fmt.Errorf("data URL must be an image, got %q", contentType) |
| 996 | } |
| 997 | } |
| 998 | // 简单 base64 解码;若包含 URL 编码等其他格式,退回 base64.URLEncoding |
| 999 | dec := base64.StdEncoding |
| 1000 | if strings.Contains(header, ";base64") { |
| 1001 | dec = base64.StdEncoding |
| 1002 | } else { |
| 1003 | dec = base64.URLEncoding |
| 1004 | } |
| 1005 | raw, err := dec.DecodeString(payload) |
| 1006 | if err != nil { |
| 1007 | // 兜底再用 StdEncoding 试一次,容忍格式不严格的输入 |
| 1008 | raw, err = base64.StdEncoding.DecodeString(payload) |
| 1009 | if err != nil { |
| 1010 | return editImageInput{}, err |
| 1011 | } |
| 1012 | contentType = "image/png" |
| 1013 | } |
| 1014 | ext := "png" |
| 1015 | switch strings.ToLower(contentType) { |
| 1016 | case "image/jpeg": |
| 1017 | ext = "jpg" |
| 1018 | case "image/gif": |
| 1019 | ext = "gif" |
| 1020 | case "image/webp": |
| 1021 | ext = "webp" |
| 1022 | } |
| 1023 | return imageEditReadJSONImage(raw, "image_url."+ext, contentType) |
| 1024 | } |
| 1025 | |
| 1026 | // imageEditDownloadHTTPURL 下载一个 https/http 图片并包装为 editImageInput。 |
| 1027 | func imageEditDownloadHTTPURL(client httpclient.AuroraHttpClient, url string) (editImageInput, error) { |
no test coverage detected