2016-07-28 95 views
0

so ..我有一個base64編碼的字符串,我需要解碼,檢查它的寬度和高度,然後保存到文件。但是..我一直在得到一個腐敗的圖像文件保存。Go - 將base64字符串保存到文件

package server 

import (
    "encoding/base64" 
    "errors" 
    "io" 
    "os" 
    "strings" 

    "image" 
    _ "image/gif" 
    _ "image/jpeg" 
    _ "image/png" 
) 

var (
    ErrBucket  = errors.New("Invalid bucket!") 
    ErrSize   = errors.New("Invalid size!") 
    ErrInvalidImage = errors.New("Invalid image!") 
) 

func saveImageToDisk(fileNameBase, data, bucket string) (string, error) { 
    idx := strings.Index(data, ";base64,") 
    if idx < 0 { 
     return "", ErrInvalidImage 
    } 

    reader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(data[idx+8:])) 
    imgCfg, fmt, err := image.DecodeConfig(reader) 
    if err != nil { 
     return "", err 
    } 

    if imgCfg.Width != 750 || imgCfg.Height != 685 { 
     return "", ErrSize 
    } 

    fileName := fileNameBase + "." + fmt 
    f, err := os.Create(fileName) 
    if err != nil { 
     return "", err 
    } 

    _, err = io.Copy(f, reader) 
    f.Close() 

    return fileName, err 
} 

它確實保存一個文件..和我測試的base64是有效的,因爲在線base64到圖像轉換器。任何幫助?

http://pastebin.com/u18eRv7d下面是我使用(在FUNC數據)

+1

閱讀時不讀者是否「用盡」其內容? – Siguza

回答

0

這些代碼的主要問題是BASE64字符串,當你閱讀io.Reader,光標不會回到第一。你已經閱讀了解碼圖像配置上的io.Reader。所以,當你把它寫入文件,它會讀取下一個,直到EOF(這可能不是你的數據)

我不知道如何重置io.Reader回到第一,但我寫了一個工作,使周圍的工作它的工作:

import (
    "encoding/base64" 
    "errors" 
    "strings" 

    "image" 
    _ "image/gif" 
    _ "image/jpeg" 
    _ "image/png" 
    "io/ioutil" 
    "bytes" 
) 

var (
    ErrBucket  = errors.New("Invalid bucket!") 
    ErrSize   = errors.New("Invalid size!") 
    ErrInvalidImage = errors.New("Invalid image!") 
) 

func saveImageToDisk(fileNameBase, data string) (string, error) { 
    idx := strings.Index(data, ";base64,") 
    if idx < 0 { 
     return "", ErrInvalidImage 
    } 
    reader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(data[idx+8:])) 
    buff := bytes.Buffer{} 
    _, err := buff.ReadFrom(reader) 
    if err != nil { 
     return "", err 
    } 
    imgCfg, fm, err := image.DecodeConfig(bytes.NewReader(buff.Bytes())) 
    if err != nil { 
     return "", err 
    } 

    if imgCfg.Width != 750 || imgCfg.Height != 685 { 
     return "", ErrSize 
    } 

    fileName := fileNameBase + "." + fm 
    ioutil.WriteFile(fileName, buff.Bytes(), 0644) 

    return fileName, err 
} 
0

對方回答沒有爲我工作,我希望能夠將圖像保存爲無論圖像格式的文件:

package main 

import (
    "bytes" 
    "encoding/base64" 
    "image/gif" 
    "image/jpeg" 
    "image/png" 
    "log" 
    "os" 
    "strings" 

    _ "github.com/jinzhu/gorm/dialects/postgres" 
) 

const data = `data:image/gif;base64,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` 

func main() { 
    idx := strings.Index(data, ";base64,") 
    if idx < 0 { 
     panic("InvalidImage") 
    } 
    ImageType := data[11:idx] 
    log.Println(ImageType) 

    unbased, err := base64.StdEncoding.DecodeString(data[idx+8:]) 
    if err != nil { 
     panic("Cannot decode b64") 
    } 
    r := bytes.NewReader(unbased) 
    switch ImageType { 
    case "png": 
     im, err := png.Decode(r) 
     if err != nil { 
      panic("Bad png") 
     } 

     f, err := os.OpenFile("example.png", os.O_WRONLY|os.O_CREATE, 0777) 
     if err != nil { 
      panic("Cannot open file") 
     } 

     png.Encode(f, im) 
    case "jpeg": 
     im, err := jpeg.Decode(r) 
     if err != nil { 
      panic("Bad jpeg") 
     } 

     f, err := os.OpenFile("example.jpeg", os.O_WRONLY|os.O_CREATE, 0777) 
     if err != nil { 
      panic("Cannot open file") 
     } 

     jpeg.Encode(f, im, nil) 
    case "gif": 
     im, err := gif.Decode(r) 
     if err != nil { 
      panic("Bad gif") 
     } 

     f, err := os.OpenFile("example.gif", os.O_WRONLY|os.O_CREATE, 0777) 
     if err != nil { 
      panic("Cannot open file") 
     } 

     gif.Encode(f, im, nil) 
    } 
} 

這種支持PNG,GIF和jpeg。