使用jquery和asp.net服务器端函数调用强制下载文件

时间:2012-05-14 14:06:23

标签: jquery asp.net

我有一个图像,我只是试图通过jquery ajax调用显示另存为下载该图像的对话框。当某人点击按钮然后运行客户端代码时,这里的代码如下

$("#btnSaveAsImage").click(function () {
    if (_TrackNumber == '') {
        alert('Track Number is not valid');
        return;
    }
    var fname = _TrackNumber + '.gif';
    var DTO = { FileName: fname };

    jQuery.ajax({
        type: "POST",
        url: "UPSLabelFormUK.aspx/SaveAs",
        data: JSON.stringify(DTO),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data) {
            var retVal = data.d;
            alert(retVal);
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert(textStatus);
        }
    });
    return false;
});

这个客户端代码实际上调用了我的服务器端功能。服务器端功能看起来像

[WebMethod]
    public static void SaveAs(string FileName)
    {
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.WriteFile(HttpContext.Current.Server.MapPath(@"~/UPS_New/LabelImages/" + FileName));
        HttpContext.Current.Response.Flush();
        HttpContext.Current.Response.Close();
    }

当服务器端函数执行结束时,jsuery显示错误消息,如解析错误。我只是不明白为什么错误来了,为什么保存为对话框不会......任何想法请与我分享。感谢

1 个答案:

答案 0 :(得分:0)

你得到解析错误的原因是因为jQuery被告知将AJAX调用的返回值解释为JSON。行dataType: "json"告诉jQuery你期望从服务器获得JSON,所以它可以继续通过JSON解析器运行它。但是,您的服务器正在尝试返回数据流 - 显然不是 JSON。

我不确定你想做的事情是否可行。 AJAX不适用于文件类型或基于流的响应。它用于XML(异步Javascript和 XML )或JSON。无论哪种方式,AJAX通常用于解释来自服务器的基于文本的响应,而不是基于流的响应。所以你试图用jQuery做的事情可能不会起作用。

相反,为什么不提供图像的直接下载链接。请参阅以下问题以供参考:

Open the Save Image dialog using jQuery/Javascript?