我需要更新此Golang代码的帮助。 其中的方法已被弃用,而且我不太了解云数据存储

Can anyone help me rewrite this function. The methods in it have been deprecated, but I don't understand enough about Google's datastore to update this code. https://cloud.google.com/appengine/docs/deprecations/files_api

func uploadBlob(w http.ResponseWriter, r *http.Request) {
    bodyData, error := ioutil.ReadAll(r.Body)
    fileType := r.URL.Query()["type"][0]

    var mimeType string

    if fileType == "png" {
        mimeType = "image/png"
    } else {
        mimeType = "application/pdf"
    }

    context := appengine.NewContext(r)

    writer, error := blobstore.Create(context, mimeType)
    if error != nil {
        return
    }

    _, error = writer.Write(bodyData)
    if error != nil {
        return
    }

    error = writer.Close()
    if error != nil {
        return
    }

    var k appengine.BlobKey
    k, _ = writer.Key()

    encoder := json.NewEncoder(w)
    encoder.Encode(&UploadBlobResponse{ Key: string(k) })
}

Thanks in advance. If you'd need more information let me know. The package is short so I can probably link all of it.

I'm using the storage api "google.golang.org/cloud/storage"

  1. You need to create an oauth2 context

    func NewCloudStorageContext(c context.Context) context.Context {
    hc := &http.Client{
        Transport: &oauth2.Transport{
            Source: google.AppEngineTokenSource(c, storage.ScopeFullControl),
            Base:   &urlfetch.Transport{Context: c},
        },
    }
    return cloud.NewContext(appengine.AppID(c), hc)}
    
  2. Upload data

    func Upload(c context.Context, req UploadRequest) (string, error) {
    
    // get CloudStorage Authenticated Context
    ctx := NewCloudStorageContext(c)
    
    // generate file name
    fileName := BackupFolder + req.Table + "/" + generateFileName(16)
    
    // get default bucket
    bucketName, err := getDefaultBucket(c)
    if err != nil {
        log.Errorf(c, "failed to get default GCS bucket name: %v", err)
        return fileName, err
    }
    
    log.Debugf(c, "Creating file. bucket: %s, file name : %s", bucketName, fileName)
    
    wc := storage.NewWriter(ctx, bucketName, fileName)
    wc.ContentType = req.FileType
    wc.ACL = []storage.ACLRule{{storage.AllUsers, storage.RoleReader}}
    
    defer wc.Close()
    //Write file
    if _, err := wc.Write(req.Payload); err != nil {
        log.Errorf(c, "createFile: unable to write data to bucket %s, error: %s", bucketName, err.Error)
        return fileName, err
    }
    if err := wc.Close(); err != nil {
        log.Errorf(c, "createFile: unable to close bucket %s, error : %s", bucketName, err.Error)
        return fileName, err
    }
    
    return fileName, nil}