如何将Blob(Excel文件)上传到Azure存储帐户

问题描述 投票:1回答:2

我正在尝试使用NPOI.XSSF库创建一个Excel报告。当我使用FileStream保存到磁盘文件时,它工作正常,但是,如果我使用内存流并尝试将其上传到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));
    }
}

我做错了什么导致文件损坏?

c# azure azure-storage-blobs npoi
2个回答
1
投票

我认为问题是您在第一个GetBuffer上使用了GetBuffer创建了第二个。从MemoryStream

备注

请注意,缓冲区包含分配的字节,这些字节可能未使用。例如,如果将字符串“ test”写入MemoryStream对象,则从documentation返回的缓冲区的长度为256,而不是4,未使用252个字节。要仅获取缓冲区中的数据,请使用MemoryStream方法;但是,MemoryStream在内存中创建数据的副本。

[可能发生的是,您在缓冲区的流末尾得到了多余的零字节。 Excel不知道如何处理多余的字节,因此它声明工作簿已损坏。由于XLSX是一种压缩格式,因此带有多余零的文件大小完全有可能与没有多余零的情况相同,因此您可能无法仅通过查看来分辨出来。

总之,应该使用GetBuffer来防止损坏。

要解决,请更改此行:

GetBuffer

为此:

ToArray

0
投票

要将文件上传到Azure blob,可以使用Microsoft提供的默认“ Azure.Storage.Blobs”库。然后创建对容器的引用,并在blob.upload(path)中提供文件的路径。

链接:ToArray

© www.soinside.com 2019 - 2024. All rights reserved.