github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/internal/build/azure.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:38</date> 10 //</624450091528228864> 11 12 13 package build 14 15 import ( 16 "context" 17 "fmt" 18 "net/url" 19 "os" 20 21 "github.com/Azure/azure-storage-blob-go/2018-03-28/azblob" 22 ) 23 24 //azureBlobstoreConfig是一个身份验证和配置结构,其中包含 25 //Azure SDK与中的speicifc容器交互所需的数据 26 //博客商店。 27 type AzureBlobstoreConfig struct { 28 Account string //帐户名称以授权API请求 29 Token string //上述帐户的访问令牌 30 Container string //要将文件上载到的Blob容器 31 } 32 33 //AzureBlobstoreUpload uploads a local file to the Azure Blob Storage. 注意,这个 34 //方法假定最大文件大小为64MB(Azure限制)。较大的文件将 35 //需要实现多API调用方法。 36 // 37 //请参阅:https://msdn.microsoft.com/en-us/library/azure/dd179451.aspx anchor_3 38 func AzureBlobstoreUpload(path string, name string, config AzureBlobstoreConfig) error { 39 if *DryRunFlag { 40 fmt.Printf("would upload %q to %s/%s/%s\n", path, config.Account, config.Container, name) 41 return nil 42 } 43 //Create an authenticated client against the Azure cloud 44 credential := azblob.NewSharedKeyCredential(config.Account, config.Token) 45 pipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{}) 46 47 u, _ := url.Parse(fmt.Sprintf("https://%s.blob.core.windows.net“,配置帐户) 48 service := azblob.NewServiceURL(*u, pipeline) 49 50 container := service.NewContainerURL(config.Container) 51 blockblob := container.NewBlockBlobURL(name) 52 53 //将要上载的文件传输到指定的blobstore容器中 54 in, err := os.Open(path) 55 if err != nil { 56 return err 57 } 58 defer in.Close() 59 60 _, err = blockblob.Upload(context.Background(), in, azblob.BlobHTTPHeaders{}, azblob.Metadata{}, azblob.BlobAccessConditions{}) 61 return err 62 } 63 64 //AzureBlobstoreList lists all the files contained within an azure blobstore. 65 func AzureBlobstoreList(config AzureBlobstoreConfig) ([]azblob.BlobItem, error) { 66 credential := azblob.NewSharedKeyCredential(config.Account, config.Token) 67 pipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{}) 68 69 u, _ := url.Parse(fmt.Sprintf("https://%s.blob.core.windows.net“,配置帐户) 70 service := azblob.NewServiceURL(*u, pipeline) 71 72 //列出容器中的所有blob并将其返回 73 container := service.NewContainerURL(config.Container) 74 75 res, err := container.ListBlobsFlatSegment(context.Background(), azblob.Marker{}, azblob.ListBlobsSegmentOptions{ 76 MaxResults: 1024 * 1024 * 1024, //是的,把它们都拿出来 77 }) 78 if err != nil { 79 return nil, err 80 } 81 return res.Segment.BlobItems, nil 82 } 83 84 //azureblobstorelete迭代要删除的文件列表并删除它们 85 //从墓碑上。 86 func AzureBlobstoreDelete(config AzureBlobstoreConfig, blobs []azblob.BlobItem) error { 87 if *DryRunFlag { 88 for _, blob := range blobs { 89 fmt.Printf("would delete %s (%s) from %s/%s\n", blob.Name, blob.Properties.LastModified, config.Account, config.Container) 90 } 91 return nil 92 } 93 //Create an authenticated client against the Azure cloud 94 credential := azblob.NewSharedKeyCredential(config.Account, config.Token) 95 pipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{}) 96 97 u, _ := url.Parse(fmt.Sprintf("https://%s.blob.core.windows.net“,配置帐户) 98 service := azblob.NewServiceURL(*u, pipeline) 99 100 container := service.NewContainerURL(config.Container) 101 102 //迭代这些blob并删除它们 103 for _, blob := range blobs { 104 blockblob := container.NewBlockBlobURL(blob.Name) 105 if _, err := blockblob.Delete(context.Background(), azblob.DeleteSnapshotsOptionInclude, azblob.BlobAccessConditions{}); err != nil { 106 return err 107 } 108 } 109 return nil 110 } 111