代码拉取完成,页面将自动刷新
package browser
import (
"io"
"net/http"
"strings"
"google.golang.org/appengine"
"google.golang.org/appengine/urlfetch"
"google.golang.org/cloud"
"google.golang.org/cloud/storage"
"golang.org/x/net/context"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
)
const delimiter = "/"
type file struct {
IsFolder bool
Filename string
URL string
}
func getCloudContext(aeCtx context.Context, credentials string) (context.Context, error) {
conf, err := google.JWTConfigFromJSON(
[]byte(credentials),
storage.ScopeFullControl,
)
if err != nil {
return nil, err
}
tokenSource := conf.TokenSource(aeCtx)
hc := &http.Client{
Transport: &oauth2.Transport{
Source: tokenSource,
Base: &urlfetch.Transport{Context: aeCtx},
},
}
return cloud.NewContext(appengine.AppID(aeCtx), hc), nil
}
func listFiles(cctx context.Context, bucket, path string) ([]string, []string, error) {
q := &storage.Query{
Delimiter: delimiter,
Prefix: path,
}
objs, err := storage.ListObjects(cctx, bucket, q)
if err != nil {
return nil, nil, err
}
subfolders := []string{}
for _, v := range objs.Prefixes {
subfolders = append(subfolders, strings.TrimPrefix(v, path))
}
files := []string{}
for _, v := range objs.Results {
files = append(files, v.Name)
}
return files, subfolders, nil
}
func getFile(cctx context.Context, bucket, path string) (io.ReadCloser, error) {
return storage.NewReader(cctx, bucket, path)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。