google-app-engine - blobstore.ParseUpload 在开发服务器和部署中的行为不同

标签 google-app-engine go blobstore

我正在尝试发送一个包含文件和访问 token 的多部分/表单, 它在开发服务器上运行良好,但是 AppEngine 部署的完全相同的帖子会导致接收到不同的 token 字符串(我可以看到它的长度更长。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")

编辑:我试图简单地创建一个端点来发布 token 并打印它的长度,它返回正确的长度..我做错了什么?

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

EDIT2:当我打印从 AppEngine 部署接收到的 token 时,我得到如下信息:

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

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

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

最佳答案

使用 multiplat.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
}

关于google-app-engine - blobstore.ParseUpload 在开发服务器和部署中的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16190124/

相关文章:

go - 如何在 Go 中的 HTML 文件中添加图像

google-app-engine - 将 blob servlet 与端点 api 相结合

google-app-engine - BlobStore 与云存储存储用户上传的图像

google-app-engine - 奇怪的 Java Servlet 过滤器映射行为

Java服务器如何处理Client请求并响应呢?

arrays - 计算相似的数组值

pointers - 通过将指针传递给 Go 中的函数来获取不同的值

python - 什么是最好的 Google App Engine blobstore 工作流程?

google-app-engine - 您不是此证书域的授权所有者 (Google App Engine)

google-app-engine - 谷歌数据存储全局连接