从 Web Api 压缩 Azure 存储文件和 Return 文件

Zip Azure Storage Files and Return File from Web Api

我正在尝试使用 SharpZipLib 从存储在 Azure 存储中的文件创建一个 zip 文件。不幸的是我无法 return 他们因为 Api 总是 return 一个 Json:

{"Version":{"Major":1,"Minor":1,"Build":-1,"Revision":-1,"MajorRevision":-1,"MinorRevision":-1},"Content":{"Headers":[{"Key":"Content-Disposition","Value":["attachment; filename=Documents.zip"]},{"Key":"Content-Type","Value":["application/octet-stream"]},{"Key":"Content-Length","Value":["498"]}]},"StatusCode":200,"ReasonPhrase":"OK","Headers":[],"RequestMessage":null,"IsSuccessStatusCode":true}

我使用的压缩应该有效,但是我不确定是否一切正确,因为我一直无法看到该文件。

这是压缩文件和return压缩 zip 文件的代码:

[HttpGet("DownloadFiles")]
public async Task<HttpResponseMessage> DownloadFiles(string invoiceNr, List<string> fileNames)
{
    List<CloudBlockBlob> blobs = _documentService.GetBlobs(invoiceNr, fileNames);

    MemoryStream outputMemStream = new MemoryStream();
    ZipOutputStream zipStream = new ZipOutputStream(outputMemStream);

    zipStream.SetLevel(3); //0-9, 9 being the highest level of compression

    foreach (CloudBlockBlob blob in blobs)
    {
        using (MemoryStream blobStream = new MemoryStream())
        {
            await blob.DownloadToStreamAsync(blobStream);

            ZipEntry newEntry = new ZipEntry(blob.Name);
            newEntry.DateTime = DateTime.Now;

            zipStream.PutNextEntry(newEntry);

            StreamUtils.Copy(blobStream, zipStream, new byte[4096]);
            zipStream.CloseEntry();
        }
    }

    zipStream.IsStreamOwner = false;    // False stops the Close also Closing the underlying stream.
    zipStream.Close();                  // Must finish the ZipOutputStream before using outputMemStream.

    outputMemStream.Position = 0;

    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
    result.Content = new StreamContent(outputMemStream);
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
    result.Content.Headers.ContentDisposition.FileName = "Documents.zip";
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    result.Content.Headers.ContentLength = outputMemStream.Length;
    return result;
}

return从 WebAPI 读取文件的方式不对吗?总的来说我做错了什么吗?

在此先感谢您的帮助。

当您将网络方法声明为

public async Task<HttpResponseMessage> DownloadFiles(...)

ASP.NET Core 将 HttpResponseMessage 视为模型,您的方法 returns 此文件的实例序列化为 JSON。 此方法的正确版本是

public async Task<IActionResult> DownloadFiles()
{
    ...
    return File(outputMemStream, "application/octet-stream", "Documents.zip");
}