2014-04-11 43 views
4

我對Go語言相當陌生,並且很難實現以下目標:我收到一個base64字符串(基本上是一個編碼圖像),需要將其轉換爲服務器上的二進制表單。將base64請求正文編碼爲二進制

func addOrUpdateUserBase64(w http.ResponseWriter, r *http.Request, params martini.Params) { 
    c := appengine.NewContext(r) 
    sDec, _ := b64.StdEncoding.DecodeString(r.Body) 
... 

這是行不通的,因爲DecodeString需要一個字符串...如何將request.Body轉換爲字符串?任何提示都非常感謝!

回答

6

不要使用base64.StdEncoding.DecodeString,而不是從r.Body

dec := base64.NewDecoder(base64.StdEncoding, r.Body)` // dec is an io.Reader 

建立一個解碼器直接現在使用dec,例如轉儲到bytes.Buffer

buf := &bytes.Buffer{} 
n, err := io.copy(buf, dec) 

r.Body解碼成BUF,或直接複製到http.Response或文件。

或者使用Peter的方法,如果保持所有內存都沒關係。

+0

工作,我覺得這是應該做的正確方法它。我會用'new(bytes.Buffer)'來表示樣式;) – fabrizioM

+0

哇!這是純粹的迷人。你能否推薦任何與io.Readers/Writers有特別關係的進一步閱讀,以及它們在Go中的使用情況? – Ralf

+0

[this](http://blog.golang.org/gif-decoder-exercise-in-go-interfaces)和[this](http://blog.golang.org/json-rpc-tale-of-界面)和[this]的開始部分(http://blog.golang.org/laws-of-reflection)和[this](http://golang.org/doc/effective_go.html#interfaces_and_types)。 – kostix

1

func (*Encoding) Decode

func (enc *Encoding) Decode(dst, src []byte) (n int, err error) 

解碼解碼SRC使用編碼ENC。它至多寫入 DecodedLen(len(src))字節到dst並返回寫入的字節數 。如果src包含無效的base64數據,它將返回成功寫入的 字節數和CorruptInputError。新行 字符(\ r和\ n)被忽略。

-1

而且多了一個選擇是隻是投放r.Bodystring

//編輯,固定的代碼與io.Reader

import "io/ioutil" 
.......... 
if body, err := ioutil.ReadAll(r.Body); err == nil { 
     sDec, _ := b64.StdEncoding.DecodeString(string(body)) 
} 
+1

我不認爲這會奏效:r.Body不能轉換爲字符串,它是一個io.ReadCloser。 – Volker

+0

我沒有意識到,我認爲它是[]字節。 – OneOfOne

相關問題