Как загрузить BLOB-объект (файл Excel) в учетную запись Azure Storage - PullRequest
1 голос
/ 04 мая 2020

Я пытаюсь создать отчет в Excel, используя библиотеку NPOI.XSSF. Он отлично работает, когда я сохраняю в файл на диске, используя FileStream; Тем не менее, если я использую MemoryStream и пытаюсь загрузить его в учетную запись Azure, он загружает файл с правильным размером, но когда я пытаюсь открыть его с помощью Excel, он поврежден.

Это мой код:

public static void ExportToStorageAccount(string storageConnection, IEnumerable<ReportEntry> reportEntries)
{
    var storageAccount = CloudStorageAccount.Parse(storageConnection);
    var myClient = storageAccount.CreateCloudBlobClient();
    var container = myClient.GetContainerReference("reportsContainer");

    string fileName = GetFileName();

    using (var ms = new MemoryStream())
    {
        IWorkbook workbook = CreateWorkbook(reportEntries);
        workbook.Write(ms);

        var blockBlob = container.GetBlockBlobReference(fileName);
        var buffer = ms.GetBuffer();
        blockBlob.UploadFromStream(new MemoryStream(buffer, false));
    }
}

Что я делаю неправильно, что делает файл поврежденным?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Я думаю, проблема в том, что вы используете GetBuffer на первом MemoryStream для создания второго. Из документации :

Замечания

Обратите внимание, что буфер содержит выделенные байты, которые могут быть неиспользованными. Например, если строка «test» записана в объект MemoryStream, длина буфера, возвращаемого из GetBuffer, равна 256, а не 4, при этом 252 байта не используются. , Чтобы получить только данные в буфере, используйте метод ToArray; однако ToArray создает копию данных в памяти.

Вероятно, что вы получаете нежелательные дополнительные нулевые байты в конце потока из буфера. Excel не знает, что делать с дополнительными байтами, поэтому объявляет, что рабочая книга повреждена. Поскольку XLSX является сжатым форматом, вполне возможно, что размер файла будет таким же с дополнительными нулями, что и без них, поэтому вы не сможете определить это, просто взглянув на это.

Короче говоря, вы Вместо этого следует использовать ToArray, чтобы предотвратить повреждение.

Чтобы исправить, измените эту строку:

var buffer = ms.GetBuffer();

На это:

var buffer = ms.ToArray();
0 голосов
/ 05 мая 2020

Чтобы загрузить файл в Azure blob, вы можете использовать библиотеку "Azure .Storage.Blobs" по умолчанию, предоставляемую Microsoft. затем создайте ссылку на контейнер и укажите путь к файлу в blob.upload (путь).

Ссылка: https://www.datastackpros.com/2020/05/programmatically-upload-file-to-azure.html

...