4

現在、WebAPI コントローラーを介して返されるファイルを強制的にダウンロードする方法を探しています。

http://www.shawnmclean.com/blog/2012/04/force-download-of-file-from-asp-net-webapi/を参照として使用していました。

私のクライアントでは、ajax GET 呼び出しを使用してオブジェクトの ID を送信し、ファイルをダウンロードしようとしています

    exportList: (foo, callback) =>
        path = '/api/export/id'
        path = path.replace("id", foo.id)
        $.ajax(
            url: path,
            dataType: 'text',
            success: (data) =>
                callback(data)
            error: (data) =>
                callback(false)
        )

サーバー側では、上記の URI を以下のメソッドにルーティングしています

    [AcceptVerbs("GET")]
    public HttpResponseMessage ExportList(int id)
    {
        string file = fooService.ExportList(id);

        if (file == null)
        {
            return Request.CreateResponse(HttpStatusCode.NoContent);
        }
        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        result.Content = new StringContent(file);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        result.Content.Headers.ContentDisposition.FileName = "List.csv";

        return result;
    }

fooService.ExportList メソッドは、単純に csv 文字列を作成します。

要求がクライアントに返されるのを監視すると、応答には csv 文字列が含まれていますが、クライアントはそれをダウンロードするように求められたり、強制されたりしません。

これは正しい方法ですか?

4

2 に答える 2

3

ダウンロードのリクエストに ajax を使用しないでください。完全な GET リクエストを実行します。必要に応じて、新しいウィンドウでダウンロードを開きます。

<a href="..." target="_blank">download file</a>
于 2012-11-07T14:35:50.960 に答える
2

動的IDのためにJavaScriptを使用していると思いますか?フォームで直接投稿できる場合は、そのようなソリューションを使用してください。JavaScript が本当に必要な場合は、次のコードを使用してフォーム アクションをシミュレートします。

$.download = function (url, data, method) {
    if (url && data) {
        //data can be string of parameters or array/object
        data = typeof data == 'string' ? data : jQuery.param(data).replace("\+", " ");
        data = data.replace(/\+/g, " ");
        var inputs = '';
        jQuery.each(data.split('&'), function () {
            var pair = this.split('=');
            inputs += '<input type="hidden" name="' + pair[0] + '" value="' + pair[1] + '" />';
        });
        //send request
        jQuery('<form action="' + url + '" method="' + (method || 'post') + '">' + inputs + '</form>')
        .appendTo('body').submit().remove();
    };
};

(ajax 呼び出しの代わりに) ダウンロードを呼び出すコード:

path = '/api/export/id'
path = path.replace("id", foo.id)
$.download(path);
于 2012-11-07T14:41:39.793 に答える