首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >dotnetzip创建空损坏文件

dotnetzip创建空损坏文件
EN

Stack Overflow用户
提问于 2018-11-29 16:45:52
回答 1查看 371关注 0票数 0

我正在尝试创建一个HTTP触发函数,它将从Azure存储中取出一个blob,将其压缩,然后将zip重新上传到blob存储中。在这条路上的某个地方这是不对的。它成功地压缩和重新上传,但压缩文件有0KB的内容,不能打开。任何帮助都将不胜感激。找到下面的代码。

代码语言:javascript
代码运行次数:0
运行
复制
 public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
    {
        log.Info("C# HTTP trigger function processed a request.");
        try
        {
          string fileName = req.GetQueryNameValuePairs()
                .FirstOrDefault(q => string.Compare(q.Key, "fileName", true) == 0)
                .Value;

            log.Info($"fileName: {fileName}");

            dynamic request = await req.Content.ReadAsAsync<object>();
            var container = (string)request.body;

            string connectionString = Environment.GetEnvironmentVariable("blobstorageconnectionstring");
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
            CloudBlobClient client = storageAccount.CreateCloudBlobClient();

            MemoryStream outputStream = new MemoryStream();

            using (ZipFile zip = new ZipFile())
            {
                zip.AddEntry($"{fileName}.xlsx", DownloadFromBlobStorage(fileName, connectionString, container));
                zip.CompressionMethod = CompressionMethod.Deflate;
                zip.Save(outputStream);
            }


            UploadToBlobStorage(fileName + "ZIP", outputStream, connectionString, container);

            return req.CreateResponse(HttpStatusCode.OK, "OK");
        }
        catch (Exception ex)
        {
            log.Error("error", ex: ex);

            return req.CreateResponse(HttpStatusCode.BadRequest);
        }

    }
    private static void UploadToBlobStorage(string name, MemoryStream dataStream, string storageConnectionString, string blobContainerName)
    {

        CloudStorageAccount account = CloudStorageAccount.Parse(storageConnectionString);
        CloudBlobClient client = account.CreateCloudBlobClient();

        CloudBlobContainer container = client.GetContainerReference(blobContainerName);
        container.CreateIfNotExists();

        CloudBlockBlob blob = container.GetBlockBlobReference(name);
        blob.Properties.ContentType = "application/x-zip-compressed";

        dataStream.Position = 0;
        blob.UploadFromStream(dataStream);
    }
    private static MemoryStream DownloadFromBlobStorage(string fileName, string storageConnectionString, string blobContainerName)
    {

        CloudStorageAccount account = CloudStorageAccount.Parse(storageConnectionString);
        CloudBlobClient client = account.CreateCloudBlobClient();

        CloudBlobContainer container = client.GetContainerReference(blobContainerName);
        container.CreateIfNotExists();

        CloudBlockBlob blob = container.GetBlockBlobReference(fileName);

        MemoryStream memStream = new MemoryStream();

        blob.DownloadToStream(memStream);

        return memStream;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-29 17:19:29

似乎您也应该将从MemoryStream返回的DownloadFromBlobStorage()对象定位为零(您已经在UploadToBlobStorage()上使用了outputStream/dataStream ),然后将它传递给zip.AddEntry()

代码语言:javascript
代码运行次数:0
运行
复制
   MemoryStream inputStream = DownloadFromBlobStorage(fileName, connectionString, container);
   inputStream.Position = 0;
   zip.AddEntry($"{fileName}.xlsx", inputStream);

看看这个答案:

Creating Zip file from stream and downloading it - Stack Overflow

经过更多的研究后,我发现通常情况下,在传递一个函数之前,应该先定位一个流:

Who is responsible for stream positioning? - Software Engineering Stack Exchange

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53543818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档