菜的像徐坤
排名
7
文章
192
粉丝
15
评论
16
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

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

9379人阅读 2021/9/14 15:43 总访问:969456 评论: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(字节数组);
现在就会提示让你下载
如果字节处理不对的话,还是能够下载,但是下载的东西打不开

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

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

  1.  public string selectAPI(string jsonStr)
  2.         {
  3.             // 地址
  4.             string url = "http://10.72.3.0:8086/CSB";
  5.             string result = "";//返回结果
  6.             try
  7.             {
  8.                 Encoding encoding = Encoding.UTF8;
  9.                 HttpWebResponse response;
  10.                 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);//webrequest请求api地址
  11.                 request.Accept = "text/html,application/xhtml+xml,*/*";
  12.                 request.ContentType = "application/json";
  13.                 //请求方式
  14.                 request.Method = "POST";
  15.                 //头文件
  16.                 request.Headers.Add("_api_timestamp""1623325847266");
  17.                 request.Headers.Add("_api_name""hssServives");
  18.                 request.Headers.Add("_api_version""1.0.0");
  19.                 request.Headers.Add("_api_access_key""3b78a66b1bb04183a0215b7b8e6e18e9");
  20.                 request.Headers.Add("_api_signature""AYbcuYagEwhnbf+zr4CjVhqSRPs=");
  21.                 try
  22.                 {
  23.                      //获取返回的Response
  24.                     response = (HttpWebResponse)request.GetResponse();
  25.                 }
  26.                 catch (WebException ex)
  27.                 {
  28.                     response = (HttpWebResponse)ex.Response;
  29.                 }
  30.                 
  31.                     //获取api中返回的流
  32.                 using (Stream stream = response.GetResponseStream())
  33.                 {
  34.                     Response.Buffer = false;
  35.                     Response.AddHeader("Connection""Keep-Alive");
  36.                     Response.ContentType = "application/octet-stream";
  37.                     Response.AddHeader("Content-Disposition""attachment;filename=" + "202108236311203928731769282.txt.zip"); // 此处文件名如果是中文在浏览器默认是筹码,应该加HttpUtility.UrlEncode(filename)   url:为下载文件的服务器地址和名称
  38.                     while (true)    //如果文件大于缓冲区,通过while循环多次加载文件 
  39.                     {
  40.                         //开辟缓冲区空间   
  41.                         byte[] buffer = new byte[1024];  //读取文件的数据   
  42.                         int leng = stream.Read(buffer, 01024);
  43.                         if (leng == 0)             //到文件尾,结束   
  44.                             break;
  45.                         if (leng == 1024)            //读出的文件数据长度等于缓冲区长度,直接将缓冲区数据写入  
  46.                             Response.BinaryWrite(buffer);           //向客户端发送数据流 
  47.                         else
  48.                         {
  49.                             //读出文件数据比缓冲区小,重新定义缓冲区大小,只用于读取文件的最后一个数据块  
  50.                             byte[] b = new byte[leng]; for (int i = 0; i < leng; i++)
  51.                                 b[i] = buffer[i];
  52.                             Response.BinaryWrite(b);
  53.                         }
  54.                     }
  55.                     stream.Close();//关闭下载文件  
  56.                     Response.End();//结束文件下载 
  57.                 }
  58.                 if (response.StatusCode != HttpStatusCode.OK)//返回响应码非成功格式化数据后返回
  59.                 {
  60.                     result = "Exception:" + result;
  61.                 }
  62.                 return result;
  63.             }
  64.             catch (WebException ex)
  65.             {
  66.                 return "Exception:" + ex.Message;
  67.             }
  68.         }

终于把这个问题搞定了!

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

评价

获取字符串的长度中文占两个长度

js获取:String.prototype.gblen=function(){ varlen=0; for(vari=0;i&lt;this.length;i++){ if(this.charCodeAt(i)&gt;...

ios 键盘弹出时获取键盘高度

Objective-C实现://增加监听,当键盘出现或改变时收出消息 [[NSNotificationCenter defaultCenter] addObserver:self ...

通过url传递一个带井号()的参数并正确获取

正常情况下支持通过url是不能传递#等特殊符号的但是可以通过url编码解码解决通过url传递参数时某些特殊符号不能传递的问题n...

原生js获取单选框复选框等信息

原生js获取单选框复选框等信息vardoreg=function(){ //根据name获取用户名 varusername=document.getElementsByName(&q...

net core获取绝对路径获取项目根目录。wwwroot所在的根目录

在net framework中获取绝对路径可以使用Server.MapPath(&quot;~&quot;)but.....在net core中并没有那个Server对象了在net c...

js、JQuery获取文本的宽高

页面编写:&lt;!DOCTYPEhtml&gt; &lt;html&gt; &lt;head&gt; &lt;metacharset=&quot;UTF-8&quot;/&gt; &lt;title&gt;jQ...

net core 过滤器。net core 过滤器获取特性。过滤器获取控制器名称获取action名称

注册过滤器的位置和net framework有点区别,但是也差不多。3.x版本中services.AddControllersWithViews(a=&gt; { //配置...

vue.js 学习日记第四章-vue中文本框数据获取与绑定及computed计算属性

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第三章: http://www.tnblog.net/18323015640/article/details/2...

ServiceStack.Redis删除以某个key开头的数据。获取某个key开头的数量每个key开头的所有Key

删除以userkey开头的数据redis.RemoveByPattern(&quot;userkey*&quot;);还可以考虑使用正则表达式删除redis.RemoveByRegex(...

.net 微信开发获取access_token使用缓存处理token过期

获取access_token很简单,使用httpclient发起一个请求就可以了,我们使用redis做一下缓存处理publicstaticstringGetToken()...

net core中获取用户请求ip地址

方法一:通过注入来获取先添加一个依赖注入services.AddSingleton&lt;IHttpContextAccessor,HttpContextAccessor&gt;();在...

net core过滤器。net core过滤器中获取依赖注入对象。net core过滤器中使用依赖注入。ServiceFilter 

虽然对象都可以直接实例化得到。但是所有的对象依赖关系,都用DI容器去管理,这样后面想要更换对象的时候也非常方便,项目...

net core获取请求方式IPUserAgent请求地址等

直接贴代码//获取ip地址 stringipaddress=context.HttpContext.Connection.RemoteIpAddress.ToString(); vl.Ip=ipaddress...

使用nginx后net core无法获取ip问题

使用了nginx后net core获取ip地址居然全部是本地的地址,不是外网的地址这是因为nginx转发了一次后,我们直接使用常规获取i...

.net core mvc中其他类库获取appsettings.json

appsetting:{ &quot;ApplicationSettings&quot;:{ &quot;DalAssemblyName&quot;:&quot;INGEFDal&quot; }, ... }c#:pu...

使用jquery操作元素的css样式(获取、修改等等)

使用jquery操作元素的css样式(获取、修改等等) //1、获取和设置样式 $(&quot;#tow&quot;).attr(&quot;class&quot;)...