Загруженный zip-файл в Azure содержит недопустимое содержимое и не может быть открыт - PullRequest
0 голосов
/ 03 апреля 2020

Я использую следующий код для загрузки файла XML в учетную запись Azure Blob Storage, используя пакет nuget DotNetZip.

            XmlDocument doc = new XmlDocument();
            doc.Load(path);
            string xmlContent = doc.InnerXml;
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
            var cloudBlobClient = storageAccount.CreateCloudBlobClient();
            var cloudBlobContainer = cloudBlobClient.GetContainerReference(container);
            cloudBlobContainer.CreateIfNotExists();
            using (var fs = File.Create("test.zip"))
            {
                using (var s = new ZipOutputStream(fs))
                {
                    s.PutNextEntry("entry1.xml");
                    byte[] buffer = Encoding.ASCII.GetBytes(xmlContent);
                    s.Write(buffer, 0, buffer.Length);
                    fs.Position = 0;      
                    //Get the blob ref
                    var blob = cloudBlobContainer.GetBlockBlobReference("test.zip");          
                    blob.Properties.ContentEncoding = "zip"
                    blob.Properties.ContentType = "text/plain";
                    blob.Metadata["filename"] = "test.zip";
                    blob.UploadFromStream(fs);
                }
            }

Этот код создает файл zip в моем контейнере. Но когда я загружаю его и пытаюсь открыть, я получаю следующую ошибку: «Windows не может открыть папку. Сжатая (заархивированная) папка недопустима». Но сохраненный заархивированный файл в моей директории приложения может быть распакован нормально и содержит мой xml файл. Что я делаю не так?

1 Ответ

2 голосов
/ 03 апреля 2020

Я могу воспроизвести проблему, с которой вы столкнулись. По сути, проблема в том, что содержимое не полностью записано в zip-файле, когда вы инициировали команду загрузки. В моем тесте размер zip-файла на локальном диске составлял 902 байта, однако на момент загрузки размер файлового потока составлял всего 40 байтов, и это вызывает проблему.

То, что я сделал, разделило две функции где первый просто создает файл, а другие читает из файла и загружает в хранилище. Вот код, который я использовал:

        CloudStorageAccount storageAccount = CloudStorageAccount.Parse("UseDevelopmentStorage=true");
        var cloudBlobClient = storageAccount.CreateCloudBlobClient();
        var cloudBlobContainer = cloudBlobClient.GetContainerReference("test");
        cloudBlobContainer.CreateIfNotExists();
        using (var fs = File.Create("test.zip"))
        {
            using (var s = new ZipOutputStream(fs))
            {
                s.PutNextEntry("entry1.xml");
                byte[] buffer = File.ReadAllBytes(@"Path\To\MyFile.txt");
                s.Write(buffer, 0, buffer.Length);
                //Get the blob ref
            }
        }
        using (var fs = File.OpenRead("test.zip"))
        {
            var blob = cloudBlobContainer.GetBlockBlobReference("test.zip");
            blob.Properties.ContentEncoding = "zip";
            blob.Properties.ContentType = "text/plain";
            blob.Metadata["filename"] = "test.zip";
            fs.Position = 0;
            blob.UploadFromStream(fs);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...