2017-08-02 76 views
1

目前正在使用:https://github.com/Azure/azure-sdk-for-goGolang蔚藍團塊存儲,0B斑點和覆蓋下載的斑點數據

概述:我目前正在下載從蔚藍的團塊存儲一個blob,解析blob和上傳轉錄BLOB回店在另一個名爲過濾的文件夾

問題:上傳的blob不在過濾的文件夾中,而是在根目錄中,blob是0B,沒有數據。 blob上傳也似乎破壞了我剛剛下載的blob,導致blob爲0B而沒有數據。下載blob工作正常,我能夠得到數據的[]字節數組。

代碼:

import (
"bufio" 
"fmt" 
"os" 
"strings" 
"strconv" 
"math/big" 
"bytes" 
"io/ioutil" 
"github.com/Azure/azure-sdk-for-go/storage" 
"compress/gzip" 
"encoding/base64" 
"crypto/md5" 
) 

func main() { 
    var filter bool = true             //check smart filter 
    test := 0 
    configfile, err := os.Open("config.txt")        //open configfile 
    check(err)                //check file opened 
    ConfigScanner := bufio.NewScanner(configfile)       //open buffer 
    ConfigScanner.Scan()             //get serial number 
    serialnum := ConfigScanner.Text() 
    configfile.Close()              //close the config file 
    CanLUT := ParseDBC("file.dbc")           //parse the associated DBC file 
    check(err)                //check file opened 
    m := make(map[int64]string)            //map of last seen message 
    //Azure API 
    client, err := storage.NewBasicClient(accountName, accountKey)   //get client from azure 
    check(err) 
    bsc := client.GetBlobService()           //access blob service 
    cnt := bsc.GetContainerReference("containerblob")       //get container of the blob 
    LBP := storage.ListBlobsParameters{}          
    LBP.Prefix = "dev4/dev4"            //only get blobs with dev4/dev4 prefix 
    list, err := cnt.ListBlobs(LBP)           //get list of all matching blobs 
    check(err) 
    for _, b := range list.Blobs {           //read all blobs from azure with prefix dev4/dev4 
     oa := make([]byte,0) 
     fmt.Println("getting blob: ",b.Name) 
     readCloser, err := b.Get(nil)          //get blob data 
     check(err) 
     bytesRead, err := ioutil.ReadAll(readCloser)      //read blob data to byte[] 
     check(err) 
     if len(bytesRead) < 1 { 
      continue 
     } 
     br := bytes.NewReader(bytesRead) 
     zr, err := gzip.NewReader(br)          //use gzip reader for zipped data 
     check(err) 
     uz, err := ioutil.ReadAll(zr)          //uz byte[] of unzipped file 
     check(err) 
     readCloser.Close()             //close the reader 
     zr.Close()               //close gzip reader 
     r := bytes.NewReader(uz) 
     scanner := bufio.NewScanner(r) 
     for scanner.Scan() {            //loop on each line in the input file 
      temp := ParseToFrame(scanner.Text())       //parse the line into a usable struct 
      _, exists := m[temp.nodeid]          //check if the frame has alread been seen and is stored in the hashmap 
      if exists {              //if exists in the map 
       if ChkDuplicate(m, temp) {         //is the msg a duplicate? if true the message isnt so add it 
        m[temp.nodeid] = temp.data        //update the data to the hashmap 
        DecodeFrame(temp, &oa, CanLUT, filter, serialnum)  //decode the frame and output it to another file 
       } 
      } else {              //DNE in map so add it 
       m[temp.nodeid] = temp.data 
       DecodeFrame(temp, &oa, CanLUT,filter, serialnum)   //decode the frame and output it to another file 
      } 
     }//end blob file 
     filestr := strings.Split(b.Name, "_")[1] 
     filestr = "filtered/filtered_" + filestr 
     var buffout bytes.Buffer 
     gz := gzip.NewWriter(&buffout) 
     _, err = gz.Write(oa) 
     check(err) 
     gz.Flush() 
     gz.Close() 
     compressedData := buffout.Bytes() 
     //push block blob to azure 
     fmt.Println("uploading: ",filestr) 
     clientnew, err := storage.NewBasicClient(accountName, accountKey)   //get client from azure 
     check(err) 
     senderbsc := clientnew.GetBlobService()           //access blob service 
     sendercnt := senderbsc.GetContainerReference("storeblob")       //get container of store blob 
     bblob := sendercnt.GetBlobReference("filtered_" + strings.Split(b.Name, "/")[1]) 
     err = bblob.CreateBlockBlob(nil) 
     check(err) 
     blockID := base64.StdEncoding.EncodeToString([]byte("00000")) 
     err = bblob.PutBlock(blockID, compressedData, nil) 
     check(err) 
     list, err := b.GetBlockList(storage.BlockListTypeUncommitted, nil) 
     check(err) 
     uncommittedBlocksList := make([]storage.Block, len(list.UncommittedBlocks)) 
     for i := range list.UncommittedBlocks { 
      uncommittedBlocksList[i].ID = list.UncommittedBlocks[i].Name 
      uncommittedBlocksList[i].Status = storage.BlockStatusUncommitted 
     } 
     err = b.PutBlockList(uncommittedBlocksList, nil) 
     //check if upload was good. 
     CheckHash(&compressedData,filestr,sendercnt) 
     check(err) 
     if(test == 0){ 
      break  //test only read one file 
     } 
     test++ 
    }//end for blobs  
}//end main 
+0

你爲什麼要上傳個別塊?這似乎不必要的痛苦。該SDK有一個'createBlockBlobFromReader()'方法來處理所有的blob操作。 (見[源](https://github.com/Azure/azure-sdk-for-go/blob/master/storage/blockblob.go)) –

+0

我不確定createBlockBlobFromReader()與CreateBlockBlob ()。你是說我應該創建一個區塊並將所有的斑點上傳到它,以避免每次都創建一個新的區塊?不知道如何做到這一點。此外,我上傳到天藍色是私人的,所以我需要在上傳之前設置blob的元數據和屬性? – Kennya42

回答

0

正如@DavidMakogon說,你可以使用Azure存儲SDK的API CreateBlockBlobFromReader用於轉到上傳任何讀者實現接口io.Reader天青Blob存儲。

這裏是我的示例代碼如下。

accountName := "<your-storage-account-name>" 
accountKey := "<your-storage-account-key>" 
client, _ := storage.NewBasicClient(accountName, accountKey) 
blobClinet := client.GetBlobService() 
containerName := "mycontainer" 
container := blobClinet.GetContainerReference(containerName) 

// Two sample ways for uploading 
// 1. Upload a text blob from string reader 
blobName := "upload.txt" 
blob := container.GetBlobReference(blobName) 
strReader := strings.NewReader("upload text to blob from string reader") 
blob.CreateBlockBlobFromReader(strReader, nil) 

// 2. Upload a file from file reader 
fileName := "hello.png" 
file, _ := os.Open(fileName) 
blobName := "hello.png" 
blob := container.GetBlobReference(blobName) 
blob.CreateBlockBlobFromReader(file, nil) 

希望它有幫助。

0
compressedData := buffout.Bytes() 
    //push block blob to azure 
    fmt.Println("uploading: ",filestr) 
    blockID := base64.StdEncoding.EncodeToString([]byte("00001")) 
    newblob := cnt.GetBlobReference(filestr) 
    err = newblob.CreateBlockBlobFromReader(bytes.NewReader(compressedData),nil) 
    check(err) 
    err = newblob.PutBlock(blockID, compressedData, nil) 
    check(err) 
    list, err := newblob.GetBlockList(storage.BlockListTypeUncommitted, nil) 
    check(err) 
    uncommittedBlocksList := make([]storage.Block, len(list.UncommittedBlocks)) 
    for i := range list.UncommittedBlocks { 
     uncommittedBlocksList[i].ID = list.UncommittedBlocks[i].Name 
     uncommittedBlocksList[i].Status = storage.BlockStatusUncommitted 
    } 
    err = newblob.PutBlockList(uncommittedBlocksList, nil) 
    check(err) 

這解決了我的問題,看着原來我有一個錯字調用。

list, err := b.GetBlockList(storage.BlockListTypeUncommitted, nil) 

這使azure得到一個名爲filestr的新blob並覆蓋原始blob。