


前言
请求不是自己写的接口时,获取请求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)