我将 图片dataurl获取 为base64字符串( ) ,下面是将转换dataurl为图片的函数,
dataurl
现在,如果图像为png,则png库将创建图像,而jpg库将引发错误,反之亦然。
问题是当我上传png时效果很好,但是当我 上传jpg文件时 返回此错误
无效的JPEG格式:缺少SOI标记
func (ProfileController) SetProfilePic(w http.ResponseWriter, r *http.Request) { session, _ := session.UserSession.Get(r, "mvc-user-session") var fieldMapForBasic map[string]*json.RawMessage var f *os.File data, _ := ioutil.ReadAll(r.Body) json.Unmarshal(data, &fieldMapForBasic) image, _ := json.Marshal(fieldMapForBasic["image"]) coI := strings.Index(string(image), ",") rawImage := string(image)[coI+1:] // Encoded Image DataUrl // unbased, _ := base64.StdEncoding.DecodeString(string(rawImage)) res := bytes.NewReader(unbased) path, _ := os.Getwd() // Path to store the image // newpath := filepath.Join(path + "/storage", strconv.Itoa(session.Values["id"].(int))) os.MkdirAll(newpath, os.ModePerm) uid := uuid.NewV4() fmt.Println(newpath) // if image is png this function will create the image from dataurl string // pngI, errPng := png.Decode(res) if errPng == nil { f, _ = os.OpenFile(newpath + "/" + uid.String() + ".png", os.O_WRONLY | os.O_CREATE, 0777) png.Encode(f, pngI) fmt.Println("Png generated") user := model.User{} user.ProfilePic = "storage/" + strconv.Itoa(session.Values["id"].(int)) + "/" + uid.String() session.Values["profile_pic"] = user.ProfilePic session.Save(r, w) database.Connection.Id(session.Values["id"].(int)).Update(&user) } else { fmt.Println(errPng.Error()) } // If image is Jpg this will generate the Image // jpgI, errJpg := jpeg.Decode(res) if errJpg == nil { f, _ = os.OpenFile(newpath + "/" + uid.String() + ".jpg", os.O_WRONLY | os.O_CREATE, 0777) jpeg.Encode(f, jpgI, &jpeg.Options{Quality: 75}) fmt.Println("Jpg created") } else { fmt.Println(errJpg.Error()) } defer func() { f.Close() }() render.Json(w, "ok") }
输入dataurl为:
"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCADeAN4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDtKKKK/cD8rCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/Z"
这可能有帮助
您将您的传递io.Reader给png.Decode(),这开始消耗阅读器,只是发现输入不是有效的PNG,因此返回错误。
io.Reader
png.Decode()
然后,将部分消耗的读取器传递给jpeg.Decode(),该读取器将读取尚未读取的数据(不是有效的JPEG),并返回您观察到的错误。
jpeg.Decode()
您需要为每个解码器创建一个新的阅读器:
pngI, errPng := png.Decode(bytes.NewReader(unbased)) // ... jpgI, errJpg := jpeg.Decode(bytes.NewReader(unbased))
还是更好,请考虑MIME类型,仅调用适当的解码器:
switch strings.TrimSuffix(image[5:coI], ";base64") { case "image/png": pngI, err = png.Decode(res) // ... case "image/jpeg": jpgI, err = jpeg.Decode(res) // ... }