2015-10-24 2 views
0

Может ли кто-нибудь помочь мне переписать эту функцию. Методы в нем устарели, но я недостаточно понимаю о хранилище данных Google, чтобы обновить этот код. 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) }) 
} 

Заранее спасибо. Если вам нужна дополнительная информация, дайте мне знать. Пакет короток, поэтому я могу связать его все.

+1

Как правило, вы хотите перейти по этой ссылке к их [Clo ud Storage API] (https://cloud.google.com/storage/) (подумайте «Amazon S3, но Google») и используйте это. Дополнительные ссылки: [Go samples] (https://cloud.google.com/storage/docs/json_api/v1/json-api-go-samples), [ссылка для пакета] (https://godoc.org/ google.golang.org/api/storage/v1). – twotwotwo

ответ

0

Я использую для хранения апи "google.golang.org/cloud/storage"

  1. Вам нужно создать контекст oauth2

    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. Загрузить данные

    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}