10

単純なWebアプリケーションにServiceStackを使用しています。

このアプリでは、一部のコンテンツを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 に答える