Javascript 使用AJAX将GAE文件上载到blobstore

Javascript 使用AJAX将GAE文件上载到blobstore,javascript,ajax,google-app-engine,file-upload,go,Javascript,Ajax,Google App Engine,File Upload,Go,我目前正在为谷歌应用程序引擎编写一个项目。我在将文件/图像上载到blobstore时遇到问题,而不必重新加载站点 这是html表单: <form id="file-form" action="{{.UploadUrl}}" method="POST" enctype="multipart/form-data"> <fieldset style="width: 100%;" data-uk-margin> <div class="uk-form

我目前正在为谷歌应用程序引擎编写一个项目。我在将文件/图像上载到blobstore时遇到问题,而不必重新加载站点

这是html表单:

<form id="file-form" action="{{.UploadUrl}}" method="POST" enctype="multipart/form-data">
    <fieldset style="width: 100%;" data-uk-margin>
        <div class="uk-form-row">
            <div id="fields"></div>
        </div>

        <div class="uk-form-row" style="padding-top: 5px; padding-bottom: 5px;">
            <textarea id="textArea" cols="" rows="10" name="description" placeholder="Description"></textarea>
        </div>                      
        <div class="uk-form-row" style="padding-top: 5px; padding-bottom: 5px;">
            <p>Upload File: </p> <input id="file-select" type="file" name="file-select" accept="image/png">
        </div>                              
        <div class="uk-form-row" style="opacity: 1.0;">
            <div class="uk-flex uk-flex-center" id="buttonDiv">
               <button type="submit" id="submitButton" class="uk-button uk-button-primary">Upload</button>
            </div>
        </div>
    </fieldset>
</form>
Go方法以接收文件:

c := appengine.NewContext(r)
    u := user.Current(c)

    if u == nil {
        url, err := user.LoginURL(c, r.URL.String())
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        w.Header().Set("Location", url)
        w.WriteHeader(http.StatusFound)
        return
    }

    logoutUrl, e := user.LogoutURL(c, "/redirect")
    if e != nil {
        panic(e)
    }
    email := u.Email

    uploadURL, error := blobstore.UploadURL(c, "/api/files/fileUpload", nil)
    if error != nil {
        panic(error)
    }

    data := WebpageData{LogoutUrl: logoutUrl, UserName: email, UploadUrl: uploadURL}

    template := template.Must(template.New("template").Parse(fileValue("./console/page/newForm.html")))

    err := template.Execute(w, data)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
最后是困扰我的错误: 1.从浏览器中的js控制台:

Failed to load resource: the server responded with a status of 500 (Internal Server Error)
  • 从go控制台/日志:

    2015/04/13 15:10:15 http:127.0.0.1:49543:mime:无媒体类型 goroutine 16[跑步]: net/http.func·011() /private/var/folders/00/0v42r000h01000cxqpsvccm003chb/T/appengine/go\u appengine/goroot/src/net/http/server.go:1130+0xbb api.检查(0xb0db00、0xc20800a970) api/api.go:40+0x50 api.fileUploadHandler(0xb136e0、0xc208045540、0xc2080f1d40) api/files.go:19+0x8a net/http.HandlerFunc.ServeHTTP(0x5a2088、0xb136e0、0xc208045540、0xc2080f1d40) /private/var/folders/00/0v42r000h01000cxqpsvccm003chb/T/appengine/go\u appengine/goroot/src/net/http/server.go:1265+0x41 net/http.(*ServeMux).ServeHTTP(0xc20803a690、0xb136e0、0xc208045540、0xc2080f1d40) /private/var/folders/00/0v42r000h01000cxqpsvccm003chb/T/appengine/go\u appengine/goroot/src/net/http/server.go:1541+0x17d appengine_内部手柄过滤器DEHTTP(0xb136e0、0xc208045540、0xc2080f1d40) /private/var/folders/00/0V42R000H01000CXQPSVCCM003CHB/T/appengine/go_appengine/goroot/src/appengine_internal/api_dev.go:98+0x413 net/http.HandlerFunc.ServeHTTP(0x5a20f8、0xb136e0、0xc208045540、0xc2080f1d40) /private/var/folders/00/0v42r000h01000cxqpsvccm003chb/T/appengine/go\u appengine/goroot/src/net/http/server.go:1265+0x41 net/http.serverHandler.ServeHTTP(0xc208042120、0xb136e0、0xc208045540、0xc2080f1d40) /private/var/folders/00/0v42r000h01000cxqpsvccm003chb/T/appengine/go\u appengine/goroot/src/net/http/server.go:1703+0x19a net/http。(*conn).serve(0xc2080454a0) /private/var/folders/00/0v42r000h01000cxqpsvccm003chb/T/appengine/go\u appengine/goroot/src/net/http/server.go:1204+0xb57 由net/http创建。(*Server)。服务 /private/var/folders/00/0v42r000h01000cxqpsvccm003chb/T/appengine/go_appengine/goroot/src/net/http/server.go:1751+0x35e

  • 有什么办法解决这个问题吗。 提前感谢:)

    Blobstore已被弃用:。以下是如何将文件上载到地面军事系统:

    import (
        // these are the appengine imports
        "golang.org/x/oauth2"
        "golang.org/x/oauth2/google"
        "google.golang.org/appengine"
        "google.golang.org/appengine/datastore"
        "google.golang.org/appengine/file"
        "google.golang.org/appengine/urlfetch"
        "google.golang.org/cloud"
        "google.golang.org/cloud/storage"
    )
    
    func serveFilesUpload(res http.ResponseWriter, req *http.Request) {
        ctx := appengine.NewContext(req)
    
        // every app engine app comes with a default bucket
        bucket, err := file.DefaultBucketName(ctx)
        if err != nil {
            panic(err)
        }
    
        // we can't use the regular http client because we need
        // oauth headers added, and also need to use urlfetch
        // for app engine
        hc := &http.Client{
            Transport: &oauth2.Transport{
                Source: google.AppEngineTokenSource(ctx, storage.ScopeFullControl),
                Base:   &urlfetch.Transport{Context: ctx},
            },
        }
    
        // I'm just giving files random names
        id := uuid.NewRandom().String()
    
        // this get's the file out of the multipart form
        ff, _, err := req.FormFile("file")
        if err != nil {
            panic(err)
        }
        defer ff.Close()
    
        cctx := cloud.NewContext(appengine.AppID(ctx), hc)
        wc := storage.NewWriter(cctx, bucket, id)
        io.Copy(wc, ff)
        // normally you'd just defer the .Close, but in this case
        // we care about the error it returns
        err = wc.Close()
        if err != nil {
            panic(err)
        }
    
        json.NewEncoder(res).Encode(id)
    }
    

    这里有一个完整的示例:。

    您是否考虑过在XHR请求上设置
    内容类型
    
    import (
        // these are the appengine imports
        "golang.org/x/oauth2"
        "golang.org/x/oauth2/google"
        "google.golang.org/appengine"
        "google.golang.org/appengine/datastore"
        "google.golang.org/appengine/file"
        "google.golang.org/appengine/urlfetch"
        "google.golang.org/cloud"
        "google.golang.org/cloud/storage"
    )
    
    func serveFilesUpload(res http.ResponseWriter, req *http.Request) {
        ctx := appengine.NewContext(req)
    
        // every app engine app comes with a default bucket
        bucket, err := file.DefaultBucketName(ctx)
        if err != nil {
            panic(err)
        }
    
        // we can't use the regular http client because we need
        // oauth headers added, and also need to use urlfetch
        // for app engine
        hc := &http.Client{
            Transport: &oauth2.Transport{
                Source: google.AppEngineTokenSource(ctx, storage.ScopeFullControl),
                Base:   &urlfetch.Transport{Context: ctx},
            },
        }
    
        // I'm just giving files random names
        id := uuid.NewRandom().String()
    
        // this get's the file out of the multipart form
        ff, _, err := req.FormFile("file")
        if err != nil {
            panic(err)
        }
        defer ff.Close()
    
        cctx := cloud.NewContext(appengine.AppID(ctx), hc)
        wc := storage.NewWriter(cctx, bucket, id)
        io.Copy(wc, ff)
        // normally you'd just defer the .Close, but in this case
        // we care about the error it returns
        err = wc.Close()
        if err != nil {
            panic(err)
        }
    
        json.NewEncoder(res).Encode(id)
    }