I'm using Service Stack for a simple web application.
In this app i need to "export" some content to Excel.. So this is the approach I took:
GET
method, I read the file and
make the download with ContentType:"application/vnd.ms-excel"
I used this approach without Service Stack in other times, and worked well.. The XLS
file had the right content and some colors.
Now, when I get the file using GET
method (i.e., visiting the url with the browser), the file contents are bad.
ServiceStack let download with some formats: html, csv, jsv, json, xml.
The html format shows up a default report page, the only format that works a little is jsv.
My question is: how can I download the file like plain html file?
Some code:
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;
}
}
Thanks in advance
The HttpResult Constructor in ServiceStack as an overload that supports file downloads, e.g:
return new HttpResult(new FileInfo("tmp/"+file+".html"),
asAttachment: true,
contentType: "application/vnd.ms-excel");
Which will set the ContentDisposition
HTTP headers required for file downloading.
For more fine-grained control of the HttpOutput you can also create your own Result class. Here is an example of downloading an Excel spreadsheet taken from the customized responses in ServiceStack question:
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);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With