Используйте сжатый файл gzip с помощью метода UploadBlobAsync

#c# #azure #azure-blob-storage

Вопрос:

Я хочу сжать строку json и сохранить ее в файле gzip. У меня есть следующий код ниже, который работает, но только сохраняет его в виде файла .json. При использовании сжатия файлы становятся меньше. Если я сожму строку json и изменю имя файла на .gz, я не смогу открыть ее с помощью 7zip.

         string containerEndpoint = string.Format("https://xxx.blob.core.windows.net/datafolder");
        BlobContainerClient containerClient = new BlobContainerClient(new Uri(containerEndpoint), null);

        byte[] byteArray = Encoding.ASCII.GetBytes(jsonString);
        MemoryStream stream = new MemoryStream(byteArray);

        string fileName = "test.gz";
        string blobPath = string.Format("folder/{0}", fileName);

        await containerClient.UploadBlobAsync(blobPath, stream);
 

Комментарии:

1. вы можете использовать GZipStream вместе со своим потоком памяти для создания внешнего потока перед загрузкой Blobasync

2. Где вы сжимаете контент перед загрузкой? Простое изменение расширения файла на gz не приведет к сжатию содержимого.

3. Не связано: Имейте в виду, что вы теряете совместимость с юникодом, используя кодировку ASCII здесь. (Может быть, это не имеет значения, просто говорю) Вы также должны изящно распорядиться потоком памяти («использование»).

Ответ №1:

Я добавил ваши предложения, и это сработало. Мой код теперь выглядит следующим образом:

         byte[] buffer = Encoding.UTF8.GetBytes(json);

        using (var stream = new MemoryStream())
        {

            using (var gZipStream = new GZipStream(stream, CompressionMode.Compress, true))
            {
                gZipStream.Write(buffer, 0, buffer.Length);
            }

            var compressedData = new byte[stream.Length];
            stream.Read(compressedData, 0, compressedData.Length);

            var gZipBuffer = new byte[compressedData.Length   4];
            Buffer.BlockCopy(compressedData, 0, gZipBuffer, 4, compressedData.Length);
            Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gZipBuffer, 0, 4);
            stream.Position = 0;
            string blobPath = string.Format("folder/{0}", fileName);
            await containerClient.UploadBlobAsync(blobPath, stream);

        }
 

Комментарии:

1. Если вы хотите, чтобы браузеры автоматически распаковывали gz файлы, пожалуйста, убедитесь, что Content-Encoding для свойства большого двоичного объекта задано gzip значение . HTH.