Upload file in GAE Go

2019-02-21 02:37发布

I am trying to upload a file in my GAE app. How do I the upload of a file in Google App Engine using Go and using the r.FormValue()?

4条回答
对你真心纯属浪费
2楼-- · 2019-02-21 02:40

I have tried the full example from here https://developers.google.com/appengine/docs/go/blobstore/overview, and it worked fine doing the upload in blobstore and serving it.

But inserting extra post values to be saved somewhere in the datastore erases the values of "r.FormValue() "? Please refer to the code below

func handleUpload(w http.ResponseWriter, r *http.Request) {
        c := appengine.NewContext(r)

        //tried to put the saving in the datastore here, it saves as expected with correct values but would raised a server error.

        blobs, _, err := blobstore.ParseUpload(r)
        if err != nil {
                serveError(c, w, err)
                return
        }
        file := blobs["file"]
        if len(file) == 0 {
                c.Errorf("no file uploaded")
                http.Redirect(w, r, "/", http.StatusFound)
                return
        }

        // a new row is inserted but no values in column name and description
        newData:= data{
          Name: r.FormValue("name"), //this is always blank
          Description: r.FormValue("description"), //this is always blank
        }

        datastore.Put(c, datastore.NewIncompleteKey(c, "Data", nil), &newData)

        //the image is displayed as expected
        http.Redirect(w, r, "/serve/?blobKey="+string(file[0].BlobKey), http.StatusFound)
}

Is it not possible to combine the upload with regular data? How come the values of r.FormValue() seems to disappear except for the file (input file type)? Even if I would have to force upload first before associating the blobkey, as the result of the upload, to other data, it would not be possible since I could not pass any r.FormValue() to the upload handler(which like I said becomes empty, or would raised an error when accessed prior the blobs, _, err := blobstore.ParseUpload(r) statement). I hope someone could help me solve this problem. Thank you!

查看更多
做个烂人
3楼-- · 2019-02-21 02:42

You have to go through the Blobstore Go API Overview to get an idea and there is a full example on how could you store & serve user data on Google App Engine using Go.

I would suggest you to do that example in a completely separate application, so you'll be able to experiment with it for a while before trying to integrate it to your already existing one.

查看更多
男人必须洒脱
4楼-- · 2019-02-21 02:52

In addition to using the Blobstore API, you can just use the Request.FormFile() method to get the file upload content. Use net\http package documentation for additional help.

Using the Request directly allows you to skip setting up an blobstore.UploadUrl() before handling the upload POST message.

A simple example would be:

func uploadHandler(w http.ResponseWriter, r *http.Request) {
    // Create an App Engine context.
    c := appengine.NewContext(r)

    // use FormFile()
    f, _, err := r.FormFile("file")
    if err != nil {
            c.Errorf("FormFile error: %v", err)
            return
    }
    defer f.Close()

    // do something with the file here
    c.Infof("Hey!!! got a file: %v", f)
}
查看更多
我想做一个坏孩纸
5楼-- · 2019-02-21 02:58

I managed to solve my problem by using the middle return param, "other". These code below are inside the upload handler

blobs, other, err := blobstore.ParseUpload(r)

Then assign corresponding formkey

file := blobs["file"]
**name := other["name"]** //name is a form field
**description := other["description"]** //descriptionis a form field

And use it like this in my struct value assignment

newData := data{
  Name: **string(name[0])**,
  Description: **string(description[0])**,
  Image: string(file[0].BlobKey),          
}

datastore.Put(c, datastore.NewIncompleteKey(c, "data", nil), &newData )

Not 100% sure this is the right thing but this solves my problem and it is now uploading the image to blobstore and saving other data and blobkey to datastore.

Hope this could help others too.

查看更多
登录 后发表回答