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