20

WebAPIコントローラーメソッドからの応答として9MBの.xlsファイルを送信しようとしています。ユーザーがページ上のボタンをクリックすると、ブラウザからのダウンロードがトリガーされます。

これが私がこれまでに得たものですが、それは機能しませんが、例外もスローしません。

[AcceptVerbs("GET")]
public HttpResponseMessage ExportXls()
{
    try
    {
        byte[] excelData = m_toolsService.ExportToExcelFile();

        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        var stream = new MemoryStream(excelData);
        result.Content = new StreamContent(stream);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
        {
            FileName = "Data.xls"
        };
        return result;
    }
    catch (Exception ex)
    {
        m_logger.ErrorException("Exception exporting as excel file: ", ex);
        return Request.CreateResponse(HttpStatusCode.InternalServerError);
    }
}

これは、インターフェースのボタンクリックからのcoffeescript / javascriptjqueryajax呼び出しです。

$.ajax(
    url: route
    dataType: 'json'
    type: 'GET'
    success: successCallback
    error: errorCallback 
    )

今考えてみると、おそらくdataTypeが間違っていて、jsonであってはなりません...

4

6 に答える 6

16

HTTP GET メソッドとしても機能しますが、$ajax を使用せず、代わりに window.open(url); を使用します。

C# コード:

    [HttpGet]
    [Route("report/{scheduleId:int}")]
    public HttpResponseMessage DownloadReport(int scheduleId)
    {
        var reportStream = GenerateExcelReport(scheduleId);
        var result = Request.CreateResponse(HttpStatusCode.OK);

        result.Content = new StreamContent(reportStream);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
        {
            FileName = "Schedule Report.xlsx"
        };

        return result;
    }

JS コード:

downloadScheduleReport: function (scheduleId) {
    var url = baseUrl + 'api/Tracker/report/' + scheduleId;
    window.open(url);
}
于 2016-10-25T14:20:27.243 に答える
13

これを機能させるには、いくつかの小さな変更を加える必要がありました

最初:メソッドを投稿に変更します

[AcceptVerbs("POST")]

2番目:jQuery ajax libの使用から非表示のフォームを使用するように変更します。これが、非表示のフォームを実行して送信するためのサービス関数です。

exportExcel: (successCallback) =>
    if $('#hidden-excel-form').length < 1
        $('<form>').attr(
            method: 'POST',
            id: 'hidden-excel-form',
            action: 'api/tools/exportXls'
        ).appendTo('body');

    $('#hidden-excel-form').bind("submit", successCallback)
    $('#hidden-excel-form').submit()

うまくいけば、これを行うためのより良い方法がありますが、当分の間、それは機能しており、Excelファイルをうまくダウンロードしています。

于 2013-02-12T13:37:02.547 に答える
-4

特定のボタンをクリックすると、ファイルが返されます

 public FileResult ExportXls(){
     //the byte stream is the file you want to return
     return File(bytes, "application/msexcel")
     }
于 2013-02-12T13:40:04.753 に答える