从c#

时间:2018-03-28 17:04:04

标签: c# azure azure-storage

我已压缩文件并上传到天蓝色的blob,但解压后我无法下载。我已经尝试了下面的代码,但它抛出了错误:

public FileStream Download(string strPath)
{
    Stream fs = GetFile(strPath);
    using (ZipArchive zip = new ZipArchive(fs))
    {
        var entry = zip.Entries.First();
        var memoryStream = entry.Open();
        string filename = "Report_" + GetUploadTime();
        using (var fileStream = new FileStream(filename,
                                               FileMode.CreateNew,
                                               FileAccess.ReadWrite))
        {
            memoryStream.CopyTo(fileStream); // fileStream is not populated
            return fileStream;
        }
    }
}

System.UnauthorizedAccessException发生在mscorlib.dll中,但未在用户代码中处理,我不想创建任何文件夹或将其保留在任何位置,只需解压缩并下载如何操作。

public Stream GetFile(string strPath)
{
    try
    {
        var filename = Path.GetFileName(strPath);
        string account = ConfigurationManager.AppSettings["BlobContainer"];
        string key = ConfigurationManager.AppSettings["BlobKey"];
        string connectionString =
            string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}",
                          account, key);
        CloudStorageAccount storageAccount =
        CloudStorageAccount.Parse(connectionString);
        var blobClient = storageAccount.CreateCloudBlobClient();

        CloudBlobContainer container = blobClient.GetContainerReference("reportportalblob");
        CloudBlockBlob blob = container.GetBlockBlobReference(filename);

        Stream blobStream = blob.OpenRead();

        return blobStream;
    }
    catch (Exception)
    {
        // download failed
        // handle exception
        throw;
    }
}

我已经搜索了一些代码,但我没有得到任何东西,请帮助。

1 个答案:

答案 0 :(得分:0)

我们可以使用以下代码获取解压缩流。

public MemoryStream GetFile(string strPath)
        {
            try
            {
                var filename = Path.GetFileName(strPath);
                string account = ConfigurationManager.AppSettings["accountName"];
                string key = ConfigurationManager.AppSettings["accountKey"];
                string containerName = "test";
                string connectionString =$"DefaultEndpointsProtocol=https;AccountName={account};AccountKey={key}";
                CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
                var blobClient = storageAccount.CreateCloudBlobClient();
                CloudBlobContainer container = blobClient.GetContainerReference(containerName);
                CloudBlockBlob blob = container.GetBlockBlobReference(filename);
                MemoryStream memory = new MemoryStream();
                blob.DownloadToStream(memory);
                var zipArchive = new ZipArchive(memory, ZipArchiveMode.Read, true);
                var entry = zipArchive.Entries.First();
                if (entry != null)
                {
                    var stream = entry.Open();
                    memory = new MemoryStream();
                    stream.CopyTo(memory);
                    memory.Position = 0;
                    return memory;
                }

                return null;
            }
            catch (Exception)
            {
                // download failed
                // handle exception
                throw;
            }
        }

如果我们想要归档,那么我们可以使用File.WriteAllBytes(strPath,memory.ToArray());fileStream.Write(memory.ToArray(),0,memory.ToArray().Length-1);

 public void Download(string strPath)
    {
            var memory = GetFile(strPath);

            string filename = "Report_" + DateTime.Now;
            var fileStream = new FileStream(filename,
            FileMode.CreateNew,
            FileAccess.ReadWrite);
            // File.WriteAllBytes(strPath,memory.ToArray());
            fileStream.Write(memory.ToArray(),0,memory.ToArray().Length-1);
    }