50010702506256
分类:
文件流
前言
请求不是自己写的接口时,获取请求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)