blobstore.ParseUpload在开发服务器和部署中的行为方式不同

时间:2013-04-24 10:54:17

标签: google-app-engine go blobstore

我正在尝试使用文件和访问令牌发送multipart / form, 它与开发服务器一起工作正常,但是与AppEngine部署完全相同的帖子会产生一个不同的收到的令牌字符串(我可以看到它的长度更长。当它应该是902时,它是938个字符。)

我实际上正在执行完全相同的POST请求:

curl -X POST --form "token=<ACCESS_TOKEN>" --form "file=@myfile.jpg" 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=
.
.

它有换行符...由于某种原因,开发服务器的行为不像那样,并且不会拆分行。

如何获取原始字符串或停止此行为?

1 个答案:

答案 0 :(得分:0)

如何使用multipart.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
}