菜的像徐坤
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

获取API中返回的文件,并下载

8921人阅读 2021/9/14 15:43 总访问:879832 评论:0 收藏:0 手机
分类: 文件流

前言

请求不是自己写的接口时,获取请求api中返回的文件


api中的头文件记得加



返回的不是文本不能直接使用StreamReader,这个实体类只会返回文本字符串,获取文件就是乱码(这里很坑)
后边历尽千辛万苦
                    这里声名一下返回的是一个 附件(attachment)

                    Response.Buffer = false;

                    Response.AddHeader("Connection", "Keep-Alive");

                    Response.ContentType = "application/octet-stream";

                    Response.AddHeader("Content-Disposition", "attachment;filename=" + "202108236311203928731769282.txt.zip");
// 此处文件名如果是中文在浏览器默认是筹码,应该加HttpUtility.UrlEncode(filename)   url:为下载文件的服务器地址和名称


                    //获取api中返回的流

                    Stream stream = response.GetResponseStream();

 stream 就是api中返回的文件,需要进行特殊处理,也就是进行字节处理,最后通过Response.BinaryWrite(字节数组);
现在就会提示让你下载
如果字节处理不对的话,还是能够下载,但是下载的东西打不开

这个代码能够应付大多数的文件流下载

前提是先拿到返回的流,然后解析

 public string selectAPI(string jsonStr)
        {
            // 地址
            string url = "http://10.72.3.0:8086/CSB";
            string result = "";//返回结果
            try
            {
                Encoding encoding = Encoding.UTF8;
                HttpWebResponse response;
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);//webrequest请求api地址

                request.Accept = "text/html,application/xhtml+xml,*/*";
                request.ContentType = "application/json";
                //请求方式
                request.Method = "POST";
                //头文件
                request.Headers.Add("_api_timestamp", "1623325847266");
                request.Headers.Add("_api_name", "hssServives");
                request.Headers.Add("_api_version", "1.0.0");
                request.Headers.Add("_api_access_key", "3b78a66b1bb04183a0215b7b8e6e18e9");
                request.Headers.Add("_api_signature", "AYbcuYagEwhnbf+zr4CjVhqSRPs=");

                try
                {
                     //获取返回的Response
                    response = (HttpWebResponse)request.GetResponse();
                }
                catch (WebException ex)
                {
                    response = (HttpWebResponse)ex.Response;
                }
                
                    //获取api中返回的流
                using (Stream stream = response.GetResponseStream())
                {

                    Response.Buffer = false;
                    Response.AddHeader("Connection", "Keep-Alive");
                    Response.ContentType = "application/octet-stream";
                    Response.AddHeader("Content-Disposition", "attachment;filename=" + "202108236311203928731769282.txt.zip"); // 此处文件名如果是中文在浏览器默认是筹码,应该加HttpUtility.UrlEncode(filename)   url:为下载文件的服务器地址和名称

                    while (true)    //如果文件大于缓冲区,通过while循环多次加载文件 
                    {
                        //开辟缓冲区空间   
                        byte[] buffer = new byte[1024];  //读取文件的数据   
                        int leng = stream.Read(buffer, 0, 1024);
                        if (leng == 0)             //到文件尾,结束   
                            break;
                        if (leng == 1024)            //读出的文件数据长度等于缓冲区长度,直接将缓冲区数据写入  
                            Response.BinaryWrite(buffer);           //向客户端发送数据流 
                        else
                        {
                            //读出文件数据比缓冲区小,重新定义缓冲区大小,只用于读取文件的最后一个数据块  
                            byte[] b = new byte[leng]; for (int i = 0; i < leng; i++)
                                b[i] = buffer[i];
                            Response.BinaryWrite(b);
                        }
                    }
                    stream.Close();//关闭下载文件  
                    Response.End();//结束文件下载 


                }
                if (response.StatusCode != HttpStatusCode.OK)//返回响应码非成功格式化数据后返回
                {
                    result = "Exception:" + result;
                }
                return result;
            }
            catch (WebException ex)
            {
                return "Exception:" + ex.Message;
            }
        }

终于把这个问题搞定了!

原: ASP.NET MVC 以Stream 下载文件 - 知鸟 - 博客园 (cnblogs.com)

评价