3

ファイルとアクセス トークンの両方を含む 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=
.
.

改行があります...何らかの理由で、開発サーバーはそのように動作せず、行を分割しません。

元の文字列を取得したり、この動作を停止するにはどうすればよいですか?

4

1 に答える 1

0

multiplatt.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 に答える