MCPcopy Create free account
hub / github.com/aiprodcoder/MIXAPI / DecodeUrlImageData

Function DecodeUrlImageData

service/image.go:113–153  ·  view source on GitHub ↗
(imageUrl string)

Source from the content-addressed store, hash-verified

111}
112
113func DecodeUrlImageData(imageUrl string) (image.Config, string, error) {
114 response, err := DoDownloadRequest(imageUrl)
115 if err != nil {
116 common.SysLog(fmt.Sprintf("fail to get image from url: %s", err.Error()))
117 return image.Config{}, "", err
118 }
119 defer response.Body.Close()
120
121 if response.StatusCode != 200 {
122 err = errors.New(fmt.Sprintf("fail to get image from url: %s", response.Status))
123 return image.Config{}, "", err
124 }
125
126 mimeType := response.Header.Get("Content-Type")
127
128 if mimeType != "application/octet-stream" && !strings.HasPrefix(mimeType, "image/") {
129 return image.Config{}, "", fmt.Errorf("invalid content type: %s, required image/*", mimeType)
130 }
131
132 var readData []byte
133 for _, limit := range []int64{1024 * 8, 1024 * 24, 1024 * 64} {
134 common.SysLog(fmt.Sprintf("try to decode image config with limit: %d", limit))
135
136 // 从response.Body读取更多的数据直到达到当前的限制
137 additionalData := make([]byte, limit-int64(len(readData)))
138 n, _ := io.ReadFull(response.Body, additionalData)
139 readData = append(readData, additionalData[:n]...)
140
141 // 使用io.MultiReader组合已经读取的数据和response.Body
142 limitReader := io.MultiReader(bytes.NewReader(readData), response.Body)
143
144 var config image.Config
145 var format string
146 config, format, err = getImageConfig(limitReader)
147 if err == nil {
148 return config, format, nil
149 }
150 }
151
152 return image.Config{}, "", err // 返回最后一个错误
153}
154
155func getImageConfig(reader io.Reader) (image.Config, string, error) {
156 // 读取图片的头部信息来获取图片尺寸

Callers 1

getImageTokenFunction · 0.85

Calls 5

SysLogFunction · 0.92
DoDownloadRequestFunction · 0.85
getImageConfigFunction · 0.85
ErrorMethod · 0.80
GetMethod · 0.80

Tested by

no test coverage detected