Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web API:分别下载多个文件_C#_Azure_Web Applications_Asp.net Web Api2_Httpresponsemessage - Fatal编程技术网

C# Web API:分别下载多个文件

C# Web API:分别下载多个文件,c#,azure,web-applications,asp.net-web-api2,httpresponsemessage,C#,Azure,Web Applications,Asp.net Web Api2,Httpresponsemessage,我有一个Web Api控制器方法,可以获取传递的文档ID,它应该为请求的ID分别返回文档文件。我尝试了以下链接中的公认答案来实现此功能,但它不起作用。我不知道哪里出了问题 我的Web Api方法 public async Task<HttpResponseMessage> DownloadMultiDocumentAsync( IClaimedUser user, string documentId) { List<lo

我有一个Web Api控制器方法,可以获取传递的文档ID,它应该为请求的ID分别返回文档文件。我尝试了以下链接中的公认答案来实现此功能,但它不起作用。我不知道哪里出了问题

我的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,但只下载了一个文件,而且该文件的格式也不正确,没有扩展名。

压缩是在所有浏览器上都具有一致结果的唯一选项。MIME/multipart内容用于电子邮件,从未打算在HTTP事务的客户端接收和解析它。有些浏览器确实实现了它,有些则没有


或者,您可以将API更改为接受单个docId,并从客户端对每个docId迭代API。

压缩是在所有浏览器上都具有一致结果的唯一选项。MIME/multipart内容用于电子邮件,从未打算在HTTP事务的客户端接收和解析它。有些浏览器确实实现了它,有些则没有


或者,您可以将API更改为接收单个docId,并从客户端对每个docId迭代API。

我认为唯一的方法是压缩所有文件,然后下载一个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");
    }  
}

我认为唯一的办法是你压缩你所有的文件,然后下载一个压缩文件。我想您可以使用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");
    }  
}

@Mehdi,我尝试过压缩选项,它工作正常,但这里的要求是单独下载,所以有可能吗?我试图解释mime/multipart在不同浏览器中的实现不一致,并且不能保证它在同一浏览器的未来版本中会一致工作。e、 g.您的解决方案可以在Firefox中使用,但不能在Chrome中使用;同样,也不能保证它在Firefox的未来版本中继续工作。我建议的另一种选择是我回答的后一部分——你能把你的API改成一个docId并从你的客户那里为每个docId迭代你的API吗?我也有一种方法来下载一个文档。现在用户的需求是分别下载多个文档,这就是为什么我要为此进行研发。无论如何,非常感谢您的解释,但是如果您能为这个多文档下载提供一些示例代码,即使它只在一个浏览器中工作也没有问题,请帮我解决这个问题。不确定您为什么觉得为循环中的每个文档ID一次调用一个API会产生不同的最终结果。这将以跨浏览器兼容的方式为您提供多文档下载功能。在http中,一个请求只能有一个响应。客户端是javascript/web应用程序吗?你也尝试过自己的Firefox解决方案吗?据我所知,Firefox是唯一支持它的浏览器,但这种支持在2013年从Firefox版本22开始中断,Mozilla已经取消了对多部分混合/替换的支持。@MdAslam是的,我认为Mehdi是对的。您可以使用前端中的循环下载多个文件。你能分享你的前端代码吗?我可以帮忙吗?@Mehdi,我尝试过压缩选项,它工作正常,但这里的要求是单独的,它应该下载,所以可能吗?我试图解释mime/multipart在不同浏览器中的实现不一致,并且不能保证它在同一浏览器的未来版本中会一致工作。e、 g.您的解决方案可以在Firefox中使用,但不能在Chrome中使用;同样,也不能保证它在Firefox的未来版本中继续工作。我建议的另一种选择是我回答的后一部分——你能把你的API改成一个docId并从你的客户那里为每个docId迭代你的API吗?我也有一种方法来下载一个文档。现在用户的需求是分别下载多个文档,这就是为什么我要为此进行研发。无论如何,非常感谢您的解释,但是如果您能为这个多文档下载提供一些示例代码,即使它只在一个浏览器中工作也没有问题,请帮我解决这个问题。不确定您为什么觉得为循环中的每个文档ID一次调用一个API会产生不同的最终结果。这将以跨浏览器兼容的方式为您提供多文档下载功能。在http中,一个请求只能有一个响应。客户端是javascript/web应用程序吗?你也尝试过自己的Firefox解决方案吗?据我了解,,
Firefox是唯一一款支持它的浏览器,但这种支持在2013年中断了。从Firefox版本22开始,Mozilla已经取消了对多部分混合/替换的支持。@MdAslam是的,我认为Mehdi是对的。您可以使用前端中的循环下载多个文件。你能分享你的前端代码吗?我能帮上忙吗?我知道要两年。你找到解决办法了吗?我遇到了同样的问题。你能分享你的发现吗?我知道这将是两年。你找到解决办法了吗?我遇到了同样的问题。你能分享你的发现吗?