10

我将Service Stack用于一个简单的 Web 应用程序。

在这个应用程序中,我需要将一些内容“导出”到 Excel。所以这是我采用的方法:

  1. 我使用 jQuery 获取表格的 HTML 内容,然后获取表格的 HTML 内容,然后发送到服务。
  2. 服务将内容写入文件(使用一些 CSS)
  3. 使用相同的服务,但使用一种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;
    }
}

提前致谢

4

1 回答 1

12

ServiceStack中的 HttpResult 构造函数作为支持文件下载的重载,例如:

return new HttpResult(new FileInfo("tmp/"+file+".html"), 
    asAttachment: true, 
    contentType: "application/vnd.ms-excel");

这将设置ContentDisposition文件下载所需的 HTTP 标头。

创建自己的 Http 结果

要对 HttpOutput 进行更细粒度的控制,您还可以创建自己的 Result 类。以下是从ServiceStack 问题中的自定义响应中下载 Excel 电子表格的示例:

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);
    }
}
于 2012-08-21T18:18:48.457 回答