C# 使用ServiceStack下载文件(html内容)
我使用的是一个简单的web应用程序 在此应用程序中,我需要将一些内容“导出”到Excel。。这就是我采取的方法:C# 使用ServiceStack下载文件(html内容),c#,
servicestack,C#,
servicestack,我使用的是一个简单的web应用程序 在此应用程序中,我需要将一些内容“导出”到Excel。。这就是我采取的方法: 我使用jQuery获取一个表的HTML内容a获取HTML内容 一个表的,并发送到服务 服务将内容写入文件(使用一些CSS) 使用相同的服务,但使用GET方法,我读取文件并 使用ContentType:“application/vnd.ms excel”下载 我以前在没有服务堆栈的情况下使用过这种方法,而且效果很好。。XLS文件具有正确的内容和一些颜色 现在,当我使用get方法获取文件
GET
方法,我读取文件并
使用ContentType:“application/vnd.ms excel”下载
XLS
文件具有正确的内容和一些颜色
现在,当我使用get
方法获取文件时(即,使用浏览器访问url),文件内容不好
ServiceStack让我们下载一些格式:html、csv、jsv、json、xml
html格式显示了一个默认的报告页面,唯一有效的格式是jsv
我的问题是:如何下载像纯html文件这样的文件
一些代码:
public class ExcelService : RestServiceBase<Excel>
{
public override object OnGet (Excel request)
{
string file = request.nombre;
//Response.Clear();
HttpResult res = new HttpResult();
res.Headers[HttpHeaders.ContentType] = "application/vnd.ms-excel";
res.Headers[HttpHeaders.ContentDisposition] = "attachment; filename="+file+".xls";
string archivo = System.IO.File.ReadAllText("tmp/"+file+".html");
res.Response = archivo;
return res;
}
}
公共类ExcelService:RestServiceBase
{
公共覆盖对象OnGet(Excel请求)
{
字符串文件=request.nombre;
//Response.Clear();
HttpResult res=新的HttpResult();
res.Headers[HttpHeaders.ContentType]=“应用程序/vnd.ms excel”;
res.Headers[HttpHeaders.ContentDisposition]=“附件;文件名=“+file+”.xls”;
字符串archivo=System.IO.File.ReadAllText(“tmp/”+File+”.html”);
res.Response=archivo;
返回res;
}
}
提前感谢中的HttpResult构造函数作为支持文件下载的重载,例如:
return new HttpResult(new FileInfo("tmp/"+file+".html"),
asAttachment: true,
contentType: "application/vnd.ms-excel");
这将设置文件下载所需的ContentDisposition
HTTP头
创建自己的Http结果
为了更细粒度地控制HttpOutput,您还可以创建自己的结果类。以下是从以下站点下载Excel电子表格的示例:
public类ExcelFileResult:ihaoptions,IStreamWriterAsync
{
私有只读流_responseStream;
公共IDictionary选项{get;private set;}
public ExcelFileResult(流响应流)
{
_responseStream=responseStream;
选项=新字典{
{“内容类型”、“应用程序/八位字节流”},
{“内容处置”,“附件;文件名=\“report.xls\”;“}
};
}
公共异步任务WriteToAsync(流响应Stream,CancellationToken token=default)
{
如果(_responseStream==null)
返回;
wait_responseStream.CopyToAsync(responseStream,token);
等待响应Stream.FlushAsync(令牌);
}
}
很好的例子,对我来说很有用。值得注意的是,上面的这个类是服务操作返回的响应类。您应该如何使用IStreamWriterAsync更新这个答案?@mythz谢谢。在web环境(.NET Framework 4.6)中,我必须将“CopyToAsync”替换为“WriteToAsync”。否则,内容是一个0长度的文件(即使使用“CopyToAsync”进行单元测试会返回一个具有预期长度的流)。@labilbe奇怪,也许你的\u responseStream
位置没有设置为0
?@mythz kudos!!这就是原因。我印象深刻!
public class ExcelFileResult : IHasOptions, IStreamWriterAsync
{
private readonly Stream _responseStream;
public IDictionary<string, string> Options { get; private set; }
public ExcelFileResult(Stream responseStream)
{
_responseStream = responseStream;
Options = new Dictionary<string, string> {
{"Content-Type", "application/octet-stream"},
{"Content-Disposition", ""attachment; filename=\"report.xls\";"}
};
}
public async Task WriteToAsync(Stream responseStream, CancellationToken token = default)
{
if (_responseStream == null)
return;
await _responseStream.CopyToAsync(responseStream, token);
await responseStream.FlushAsync(token);
}
}