C# 将每个文件的文件位置获取到流中

C# 将每个文件的文件位置获取到流中,c#,http,asp.net-web-api,stream,C#,Http,Asp.net Web Api,Stream,我正在从我的web api发送多个文件,但我想读取流的每个部分,将其转换为字节数组,然后在最后我有一个字节[]列表,我可以保存每个文件: [Route("GetFiles")] public HttpResponseMessage GetFile([FromUri] List<string> filesNames) { HttpResponseMessage response = new HttpResponseMessage(HttpStatusC

我正在从我的web api发送多个文件,但我想读取流的每个部分,将其转换为字节数组,然后在最后我有一个字节[]列表,我可以保存每个文件:

 [Route("GetFiles")]
    public HttpResponseMessage GetFile([FromUri] List<string> filesNames)
    {
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.BadRequest);

        if (filesNames.Count == 0)
            return Request.CreateResponse(HttpStatusCode.BadRequest);

        var content = new MultipartContent();

        filesNames.ForEach(delegate (string fileName)
        {
            string filePath = System.Web.Hosting.HostingEnvironment.MapPath("~/Uploads/" + fileName);
            byte[] pdf = File.ReadAllBytes(filePath);

            content.Add(new ByteArrayContent(pdf));
            response.Headers.Add(fileName, fileName);
        });

        var files = JsonConvert.SerializeObject(content);

        response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
        response = Request.CreateResponse(HttpStatusCode.OK, content);

        return response;
    }
你能给我看一些文件或建议吗?

什么? 此答案提供了一个100%的工作示例:

  • 使用
    multipart/mixed
    内容类型从web API将多个文件作为单个响应提供服务
  • 通过解析在1中实现的web API的响应来读取客户端上的文件内容
  • 我希望这有帮助


    服务器: 服务器应用程序是一个支持web API的.Net 4.7.2 MVC项目

    以下方法在
    ApiController
    中实现,并在单个响应中返回
    ~/Uploads
    文件夹下的所有文件

    请注意使用
    Request.RegisterForDispose
    扩展来注册
    FileStream
    s以供以后处理

        public async Task<HttpResponseMessage> GetFiles()
        {
            string filesPath = System.Web.Hosting.HostingEnvironment.MapPath("~/Uploads");
    
            List<string> fileNames = new List<string>(Directory.GetFiles(filesPath));
    
            var content = new MultipartContent();
    
            fileNames.ForEach(delegate(string fileName)
            {
                var fileContent = new StreamContent(File.OpenRead(fileName));
                Request.RegisterForDispose(fileContent);
                fileContent.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("image/jpeg");
                content.Add(fileContent);
            });
    
            var response = new HttpResponseMessage();
            response.Content = content;
            return response;
        }
    

    您应该将响应读取为多部分formdata,而不是完整的二进制响应。否则,您将不得不自己使用边界信息解析每个部分,我不建议这样做。好的,我将尝试获取每个文件,然后以流的形式读取它们中的每个部分data@OguzOzgul你能检查一下更新吗?普尔索克。我看到了。今晚我将尝试发布一个答案,但是如果你同意的话,代码(服务器和客户端)可以更改。我找不到任何方法来解析和处理下载的多部分表单数据。几乎所有的文章都是关于如何上传的。我要做的是将二进制响应中的所有文件流化,并在客户端解析八位字节流。你也可以做的拉链,只是把它寄回来,但我认为没有必要,除非有其他客户打电话给你的APINice!很好地解释了,泰因你的时间:D
    [Route("GetFiles")]
        public HttpResponseMessage GetFiles([FromUri] List<string> filesNames)
        {
            HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.BadRequest);
    
            if (filesNames.Count == 0)
                return Request.CreateResponse(HttpStatusCode.BadRequest);
    
            var content = new MultipartFormDataContent();
    
            filesNames.ForEach(delegate (string fileName)
            {
                string filePath = System.Web.Hosting.HostingEnvironment.MapPath("~/Uploads/" + fileName);
                byte[] pdf = File.ReadAllBytes(filePath);
    
                content.Add(new ByteArrayContent(pdf), fileName);
            });
    
            response = Request.CreateResponse(HttpStatusCode.OK, content);
            response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
    
            return response;
        }
    
    using (var httpResponseMessage = await httpClient.GetAsync(urlToDownload + filesNamesArg))
                {
                    var streamProvider = new MultipartMemoryStreamProvider();
    
                    streamProvider = httpResponseMessage.Content.ReadAsMultipartAsync().Result;
                }
    
        public async Task<HttpResponseMessage> GetFiles()
        {
            string filesPath = System.Web.Hosting.HostingEnvironment.MapPath("~/Uploads");
    
            List<string> fileNames = new List<string>(Directory.GetFiles(filesPath));
    
            var content = new MultipartContent();
    
            fileNames.ForEach(delegate(string fileName)
            {
                var fileContent = new StreamContent(File.OpenRead(fileName));
                Request.RegisterForDispose(fileContent);
                fileContent.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("image/jpeg");
                content.Add(fileContent);
            });
    
            var response = new HttpResponseMessage();
            response.Content = content;
            return response;
        }
    
    using System;
    using System.IO;
    using System.Net.Http;
    
    namespace console
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (HttpClient httpClient = new HttpClient())
                {
                    using (HttpResponseMessage httpResponseMessage = httpClient.GetAsync("http://localhost:60604/api/GetImage/GetFiles").Result)
                    {
                        var content = (HttpContent)new StreamContent(httpResponseMessage.Content.ReadAsStreamAsync().Result);
                        content.Headers.ContentType = httpResponseMessage.Content.Headers.ContentType;
                        MultipartMemoryStreamProvider multipartResponse = new MultipartMemoryStreamProvider();
                        content.ReadAsMultipartAsync(multipartResponse);
                        for(int i = 0; i< multipartResponse.Contents.Count;i++)
                        {
                            Stream contentStream = multipartResponse.Contents[i].ReadAsStreamAsync().Result;
                            Console.WriteLine("Content {0}, length {1}", i, contentStream.Length);
                        }
                    }
                }
            }
        }
    }