簡體   English   中英

dotnetzip創建空的損壞的文件

[英]dotnetzip creating empty corrupted file

我正在嘗試創建一個HTTP觸發的函數,該函數將blob從Azure存儲中拉出,將其壓縮,然后將zip重新上傳到blob存儲。 一路走來這是錯誤的。 它成功壓縮並重新上傳,但是該壓縮文件的內容為0KB,無法打開。 任何幫助,將不勝感激。 在下面找到代碼。

 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;
    }

似乎您也應該將從DownloadFromBlobStorage()返回的MemoryStream對象也設置為零(您已經在UploadToBlobStorage()上使用outputStream / dataStream進行了UploadToBlobStorage() ),然后再將其傳遞給zip.AddEntry()

   MemoryStream inputStream = DownloadFromBlobStorage(fileName, connectionString, container);
   inputStream.Position = 0;
   zip.AddEntry($"{fileName}.xlsx", inputStream);

看一下這個答案:

從流創建Zip文件並下載-代碼日志

經過更多研究后,我發現通常應在將流傳遞給函數之前始終放置流:

誰負責流定位? -軟件工程堆棧交換

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM