2013-04-24 57 views
3

我試圖用文件和訪問令牌發送multipart/form, 它可以與dev服務器正常工作,但與AppEngine部署結果完全相同在一個不同的收到的令牌字符串中(我可以看到它的長度是938個字符,當它應該是902)。blobstore.ParseUpload在dev服務器和部署中的行爲不同

我實際執行完全相同的POST請求:

curl -X POST --form "token=<ACCESS_TOKEN>" --form "[email protected]" http://upload_url 

上傳回復處理程序:

c := appengine.NewContext(r) 

blobs, values, err := blobstore.ParseUpload(r) 

if err != nil { 
    http.Error(w, err.Error(), http.StatusInternalServerError) 
    return 
} 

files := blobs["file"] 

if len(files) == 0 { 
    fmt.Fprintln(w, "No file uploaded") 
    return 
} 

token := values.Get("token") 

編輯:我想簡單地張貼令牌和打印其創建終結點長度,這將返回正確的長度..我做錯了什麼?

func t(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintln(w, "%d", len(r.FormValue("token"))) 
} 

EDIT2:當我從AppEngine上部署打印接收的令牌,我得到這樣的:

eyJhbGciOiJSUzI1NiIsImtpZCI6ImZjZmQ4NGYxZGZhN2NiODUyMTg4MDFkNDRjNzYwNDFmMzB= 
lMzg2OGIifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiYXVkIjoiMjEwMTAyMTk5NDI= 
4LmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwidG9rZW5faGFzaCI6IklQMmduQjFsZGMwTE= 
VEdVg5LWlZa2ciLCJhdF9oYXNoIjoiSVAyZ25CMWxkYzBMRUR1WDktaVlrZyIsImlkIjoiMTA5O= 
. 
. 

它已換行...由於某種原因,開發服務器的行爲不一樣,並不會分割線條。

如何獲得原始字符串或停止此行爲?

回答

0

如何使用multiplart.Reader?

c := appengine.NewContext(r) 
if r.Method != "POST" { 
    http.Error(w, "invalid request", 400) 
    return 
} 
ct := r.Header.Get("Content-Type") 
if strings.SplitN(ct, ";", 2)[0] != "multipart/form-data" { 
    http.Error(w, "invalid request", 40400) 
    return 
} 
_, params, err := mime.ParseMediaType(ct) 
if err != nil { 
    http.Error(w, "invalid request", 400) 
    return 
} 
boundary, ok := params["boundary"] 
if !ok { 
    http.Error(w, "invalid request", 400) 
    return 
} 
reader := multipart.NewReader(r.Body, boundary) 
var data []byte 
for { 
    part, err := reader.NextPart() 
    if part == nil || err != nil { 
     break 
    } 
    if part.FormName() != "file" { 
     continue 
    } 
    v := part.Header.Get("Content-Disposition") 
    if v == "" { 
     continue 
    } 
    d, _, err := mime.ParseMediaType(v) 
    if err != nil { 
     continue 
    } 
    if d != "form-data" { 
     continue 
    } 
    data, _ = ioutil.ReadAll(part) 

    // do something using data 
}