3

我正在尝试发送带有文件和访问令牌的多部分/表单,它可以与开发服务器一起正常工作,但是与 AppEngine 部署完全相同的帖子会导致收到不同的令牌字符串(我可以看到它的长度是更长。938 个字符,而它应该是 902)。

我实际上正在执行完全相同的 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=
.
.

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

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

4

1 回答 1

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
}
于 2013-06-19T07:49:59.417 回答