Web API:单独下载多个文件

时间:2018-08-24 18:41:31

标签: c# azure web-applications asp.net-web-api2 httpresponsemessage

我有一个Web Api控制器方法,该方法获取传递的文档ID,它应该分别为那些请求的ID返回文档文件。我已经尝试通过以下链接获得可接受的答案,以实现此功能,但是它不起作用。我不知道我哪里做错了。

https://stackoverflow.com/questions/12266422/whats-the-best-way-to-serve-up-multiple-binary-files-from-a-single-webapi-metho

我的Web Api方法,

   public async Task<HttpResponseMessage> DownloadMultiDocumentAsync( 
             IClaimedUser user, string documentId)
    {
        List<long> docIds = documentId.Split(',').Select(long.Parse).ToList();
        List<Document> documentList = coreDataContext.Documents.Where(d => docIds.Contains(d.DocumentId) && d.IsActive).ToList();

        var content = new MultipartContent();
        CloudBlockBlob blob = null;

        var container = GetBlobClient(tenantInfo);
        var directory = container.GetDirectoryReference(
            string.Format(DirectoryNameConfigValue, tenantInfo.TenantId.ToString(), documentList[0].ProjectId));

        for (int docId = 0; docId < documentList.Count; docId++)
        {
            blob = directory.GetBlockBlobReference(DocumentNameConfigValue + documentList[docId].DocumentId);
            if (!blob.Exists()) continue;

            MemoryStream memStream = new MemoryStream();
            await blob.DownloadToStreamAsync(memStream);
            memStream.Seek(0, SeekOrigin.Begin);
            var streamContent = new StreamContent(memStream);
            content.Add(streamContent);

        }            
        HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
        httpResponseMessage.Content = content;
        httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        httpResponseMessage.StatusCode = HttpStatusCode.OK;
        return httpResponseMessage;
    }

我尝试了2个或更多文档ID,但仅下载了一个文件,而且文件格式不正确(无扩展名)。

2 个答案:

答案 0 :(得分:3)

压缩是唯一在所有浏览器上都能产生一致结果的选项。 MIME /多部分内容用于电子邮件(https://en.wikipedia.org/wiki/MIME#Multipart_messages),并且从未打算在HTTP事务的客户端上进行接收和解析。一些浏览器确实实现了它,而另一些则没有。

或者,您可以更改API以采用单个docId,并从客户端为每个docId遍历API。

答案 1 :(得分:0)

我认为唯一的方法是先压缩所有文件,然后再下载一个zip文件。我想您可以使用dotnetzip软件包,因为它易于使用。

一种方法是,您可以先将文件保存在磁盘上,然后将zip进行流传输以进行下载。另一种方法是,您可以将它们压缩到内存中,然后在流中下载文件

public ActionResult Download()
{
    using (ZipFile zip = new ZipFile())
    {
        zip.AddDirectory(Server.MapPath("~/Directories/hello"));

        MemoryStream output = new MemoryStream();
        zip.Save(output);
        return File(output, "application/zip", "sample.zip");
    }  
}