Goran Sneperger
Goran Sneperger

Reputation: 87

Zip XML file in memory and upload to azure file storage

I have a XDocument provided as a parameter that needs to be zipped and uploaded to Azure file storage. There are questions here that partly answer this but for blob storage. The signatures are different and I can't make it work for my case without getting the checksum error for zipped file up in the cloud.

public static bool ZipAndUploadDocumentToAzure(XDocument doc, Configuration config)
    {
        if (IsNullOrEmpty(config.StorageAccountName) ||
            IsNullOrEmpty(config.StorageAccountKey) ||
            IsNullOrEmpty(config.StorageAccounyShareReference) ||
            IsNullOrEmpty(config.StorageAccounyDirectoryReference))
        {
            return false;
        }

        CloudStorageAccount storageAccount = CloudStorageAccount.Parse($"DefaultEndpointsProtocol=https;AccountName={config.StorageAccountName};AccountKey={config.StorageAccountKey}");

        CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
        CloudFileShare share = fileClient.GetShareReference(config.StorageAccounyShareReference);
        CloudFileDirectory root = share.GetRootDirectoryReference();
        CloudFileDirectory dir = root.GetDirectoryReference(config.StorageAccounyDirectoryReference);

        var cloudFile = dir.GetFileReference("myarchive.zip");


        using (var stream = new MemoryStream())
        {
            var xws = new XmlWriterSettings
            {
                OmitXmlDeclaration = true,
                Indent = true
            };

            using (XmlWriter xw = XmlWriter.Create(stream, xws))
            {
                doc.WriteTo(xw);
            }

            //where to actually use ZipArchive 'using block' without saving 
            //any of the zip or XML or XDocument files locally 
            //and that it doesn't produce checksum error

            cloudFile.UploadFromStream(stream);//this gives me XML file 
                                               //saved to file storage
            return true;
        }
    }

Upvotes: 0

Views: 458

Answers (1)

Gaurav Mantri
Gaurav Mantri

Reputation: 136336

You would actually need to create a ZipArchive and then write your Xml Document there. Please see sample code below:

    static void ZipAndUploadFile()
    {
        var filePath = @"C:\Users\Gaurav.Mantri\Desktop\StateProvince.xml";
        XDocument doc = null;
        using (var fs = new FileStream(filePath, FileMode.Open))
        {
            doc = XDocument.Load(fs);
        }
        var cred = new StorageCredentials(accountName, accountKey);
        var account = new CloudStorageAccount(cred, true);
        var fc = account.CreateCloudFileClient();
        var share = fc.GetShareReference("test");
        share.CreateIfNotExists();
        var rootDirectory = share.GetRootDirectoryReference();
        var file = rootDirectory.GetFileReference("test.zip");
        using (var stream = new MemoryStream())
        {
            var xws = new XmlWriterSettings
            {
                OmitXmlDeclaration = true,
                Indent = true
            };

            using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true))
            {
                var entry = archive.CreateEntry("doc.xml");
                using (var entryStream = entry.Open())
                {
                    using (XmlWriter xw = XmlWriter.Create(entryStream, xws))
                    {
                        doc.WriteTo(xw);
                    }
                }
            }
            stream.Position = 0;
            file.UploadFromStream(stream);
        }
    }

Upvotes: 1

Related Questions