排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256
50010702506256
欢迎加群交流技术
分类:
文件流
前言
下载api中返回的文件里
与web端不同,winfrom 不能使用Responses与 Request
所以下载需要换种方式(核心是怎么拿到返回的流文件)
具体实现(选择保存地址)
string defaultPath = "";
private void button1_Click(object sender, EventArgs e)
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.Description = "请选择文件下载地址";
//首次defaultPath为空,按FolderBrowserDialog默认设置(即桌面)选择
if (defaultPath != "")
{
//设置此次默认目录为上一次选中目录
fbd.SelectedPath = defaultPath;
}
//按下确定选择的按钮
if (fbd.ShowDialog() == DialogResult.OK)
{
//记录选中的目录
defaultPath = fbd.SelectedPath;
}
}具体实现(下载的方法)
/// <summary>
/// 下载
/// </summary>
/// <param name="jsonStr"></param>
/// <returns></returns>
public string selectAPI(string jsonStr)
{
//下载的api
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
{
byte[] payload;
//将URL编码后的字符串转化为字节
payload = System.Text.Encoding.UTF8.GetBytes(jsonStr);
//设置请求的 ContentLength
request.ContentLength = payload.Length;
//获得请 求流
System.IO.Stream writer = request.GetRequestStream();
//将请求参数写入流
writer.Write(payload, 0, payload.Length);
// 关闭请求流
writer.Close();
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
response = (HttpWebResponse)ex.Response;
}
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
//返回的流文件
Stream stream = response.GetResponseStream();
//将基础流写入内存流(手动转换流)
MemoryStream memoryStreams = StreamToMemoryStream(stream);
byte[] srcBuf = new Byte[memoryStreams.Length];
memoryStreams.Read(srcBuf, 0, srcBuf.Length);
memoryStreams.Seek(0, SeekOrigin.Begin);
//配置文件名
defaultPath = defaultPath + @"\\" + Guid.NewGuid().ToString().Replace("-", "") + ".zip";
using (FileStream fs = new FileStream(defaultPath, FileMode.Create, FileAccess.Write))
{
fs.Write(srcBuf, 0, srcBuf.Length);
fs.Close();
}
}
if (response.StatusCode != HttpStatusCode.OK)//返回响应码非成功格式化数据后返回
{
result = "Exception:" + result;
}
return result;
}
catch (WebException ex)
{
return "Exception:" + ex.Message;
}
}具体实现(将基础流写入内存流的方法)
public MemoryStream StreamToMemoryStream(Stream stream)
{
MemoryStream memoryStream = new MemoryStream();
//将基础流写入内存流
const int bufferLength = 1024;
byte[] buffer = new byte[bufferLength];
int actual = stream.Read(buffer, 0, bufferLength);
while (actual > 0)
{
// 读、写过程中,流的位置会自动走。
memoryStream.Write(buffer, 0, actual);
actual = stream.Read(buffer, 0, bufferLength);
}
memoryStream.Position = 0;
return memoryStream;
}评价