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