Javascript 使用AJAX将GAE文件上载到blobstore
我目前正在为谷歌应用程序引擎编写一个项目。我在将文件/图像上载到blobstore时遇到问题,而不必重新加载站点 这是html表单: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
<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)
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)
}