#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.