Как в хранилище BLOB-объектов Azure обрабатываются файлы с расширением .gz?

У меня есть файл с именем notactuallygunzipped.gz, который представляет собой простой текстовый файл, который заканчивается на .gz и на самом деле НЕ заархивирован, что выглядит так:

1 foo bar
2 fizz buzz

Я загружаю его в Azure так:

az storage blob upload \
  --container-name testroot \
  --file notactuallygunzipped.gz \
  --name "gunzip/notactuallygunzipped.gz"

Затем я использую пакет SDK для Azure Go, чтобы получить каплю. Я бы ожидал получить что-то вроде 1 foo bar или что-то еще в байтовом формате, но вместо этого я

\x1f\x8b\x08\x08\x9d\xfa-Y\x00\x03notactuallygunzipped\x003TH\xcb\xcfWHJ,\xe22RH\xca\xccKWH\xca\xcfK\xe7\x02\x00\xa5\x00\xef\x1e\x16\x00\x00\x00

Если я переименую файл во что-то вроде plaindata.txt, он будет работать нормально, и я получу то, что ожидал:

'1 foo bar\n2 fizz buzz\n'

Лазурь делает что-то шаткое? Либо автоматическое сжатие, либо что-то в этом роде?


person Clicquot the Dog    schedule 30.05.2017    source источник


Ответы (2)


С Azure это не имеет значения. Вы загрузили notactuallygunzipped.gz файл, сжатый с помощью gzip. Вы можете прочитать его с помощью команды less, которая по умолчанию поддерживает формат распаковки gzip, который выглядит как обычный текст, но это двоичный формат при использовании cat. Поэтому вам нужно распаковать байты большого двоичного объекта, загруженного из хранилища BLOB-объектов Azure с помощью пакета go compress/gzip.

В качестве справки, вот мой пример кода с использованием Go для чтения файла gzip из хранилища BLOB-объектов Azure.

package main

import (
    "compress/gzip"
    "fmt"
    "io/ioutil"

    "github.com/Azure/azure-storage-go"
)

func main() {
    accountName := "<your-account-name>"
    accountKey := "<your-account-key>"
    client, _ := storage.NewBasicClient(accountName, accountKey)
    blobClient := client.GetBlobService()
    containerName := "mycontainer"
    container := blobClient.GetContainerReference(containerName)
    flag, _ := container.CreateIfNotExists(nil)
    fmt.Println(flag)
    blobName := "notactuallygunzipped.gz"
    blob := container.GetBlobReference(blobName)
    readCloser, _ := blob.Get(nil)
    defer readCloser.Close()
    zr, _ := gzip.NewReader(readCloser)
    content, _ := ioutil.ReadAll(zr)
    fmt.Printf("%s", content)
}

Надеюсь, это поможет.

person Peter Pan    schedule 31.05.2017
comment
Я фактически распаковываю файлы таким образом, но в моем случае я загружаю простой текстовый файл с расширением .gz - я никогда не сжимаю его (см. Мои правки) - person Clicquot the Dog; 31.05.2017
comment
@ClicquottheDog Я попытался загрузить текстовый файл с именем notactuallygunzipped.gz, таким же, как ваш, с помощью az cli tool, и загрузил его через мою программу golang без gzip. Это показывает чистый и исходный текстовый контент без какого-либо двоичного байтового формата. Поэтому я уверен, что Хранилище BLOB-объектов Azure и az инструмент не изменят ваш файл. Между тем, я подтвердил, что ваш файл был сжат в соответствии с вашим байтовым форматом содержимого из большого двоичного объекта, который включает информацию заголовка имени файла, а не только из-за расширения .gz. - person Peter Pan; 01.06.2017
comment
Оказывается, мой редактор автоматически сжимал файл - сегодня я узнал кое-что новое! - person Clicquot the Dog; 02.06.2017

BLOB - двоичный большой объект

Содержание или расширение файла не имеет значения. Из документации Azure:

Хранилище BLOB-объектов Azure - это служба, которая хранит неструктурированные данные в облаке в виде объектов / BLOB-объектов. Хранилище BLOB-объектов может хранить любой тип текстовых или двоичных данных, например документ, медиафайл или установщик приложения. Хранилище BLOB-объектов также называется хранилищем объектов.

person yonisha    schedule 02.06.2017