ajax - 从 ajax 和 ActionResult 下载文件

标签 ajax asp.net-mvc-4 download actionresult

我想使用 ajax 和 ActionResult 在浏览器上下载文件。该文件已下载并从我的 ActionResult 返回。

我看到 Http 查询没问题,并看到响应正文中的数据。问题是该文件不建议保存在浏览器中。

一切似乎都很好。我在教程和论坛中看到的所有内容都像我所做的那样,但我的不要说 XD。我不明白我和其他人有什么区别。

这是我的 ActionResult :

public ActionResult ShippingDownloadDNPriority(string SALE_GUID)
{
    int supId = -1;
    int.TryParse(Session["SupId"].ToString(), out supId);
    if (supId < 0)
        return null;

    WebResponse response = CallApi.DownloadAndCreateDN(Session["UserLogin"].ToString(), Session["IdentConnect"].ToString(), SALE_GUID, supId, true);
    Stream responseStream = response.GetResponseStream();

    var cd = new System.Net.Mime.ContentDisposition
    {
        FileName = "myfile.pdf",
        Inline = false,
    };
    Response.Headers.Add("Content-Disposition", cd.ToString());
    Response.ContentType = "application/octet-stream";
    return File(responseStream, System.Net.Mime.MediaTypeNames.Application.Pdf, "myfile.pdf");
}

public static WebResponse DownloadAndCreateDN(string login, string session, string SALE_GUID, int supid, bool priority)
{
    string[] res = new string[2];

    StringBuilder postData = new StringBuilder();
    postData.AppendLine("{");
    postData.AppendLine(string.Format("\"login\":\"{0}\",", login));
    postData.AppendLine(string.Format("\"session\":\"{0}\",", session));
    postData.AppendLine(string.Format("\"saleguid\":\"{0}\",", SALE_GUID));
    postData.AppendLine(string.Format("\"supid\":{0},", supid));
    postData.AppendLine(string.Format("\"prority\":{0}", priority.ToString().ToLower()));
    postData.AppendLine("}");

    ASCIIEncoding ascii = new ASCIIEncoding();
    byte[] postBytes = ascii.GetBytes(postData.ToString());

    string url = Properties.Settings.Default.ISAPIAddress + "deliverynote/create";

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/json";
    request.ContentLength = postBytes.Length;

    Stream postStream = request.GetRequestStream();
    postStream.Write(postBytes, 0, postBytes.Length);
    postStream.Flush();
    postStream.Close();

    return request.GetResponse();
}

这是我的 javascript :
$.ajax({
    url: '../Shipping/ShippingDownloadDNPriority?SALE_GUID=XXXXXXXXXXXXXX',
    data: { SALE_GUID: DropShipping.GetRowKey(rowIndexSale) },
    async: false,
    //success: function (data) { window.downloadFile = data; }
});

谢谢大家

最佳答案

AJAX 只是一个瘦客户端。默认情况下返回的响应没有任何 react 。您有责任进行下载。但是,这样做需要作为 HTML5 一部分的文件 API。因此,这只能在现代浏览器 (IE10+) 中实现。

在您的 AJAX 成功方法中:

var blob = new Blob(data, { type: 'application/pdf' });
var a = document.createElement('a');
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = 'myfile.pdf';
a.click();
window.URL.revokeObjectURL(url);

编辑

默认情况下,jQuery 不会正确解释响应类型。你需要稍微修改你的 $.ajax 调用:
$.ajax({
    url: '../Shipping/ShippingDownloadDNPriority?SALE_GUID=XXXXXXXXXXXXXX',
    data: { SALE_GUID: DropShipping.GetRowKey(rowIndexSale) },
    async: false,
    // -- ADD THIS --
    xhrFields: {
        responseType: 'blob'
    },
    success: function (data) {
        // code above here, but no longer need to create blob
        var a = document.createElement('a');
        var url = window.URL.createObjectURL(data);
        a.href = url;
        a.download = 'myfile.pdf';
        a.click();
        window.URL.revokeObjectURL(url);
    }
});

您可以 check out a CodePen here看到它的工作。

关于ajax - 从 ajax 和 ActionResult 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41901082/

相关文章:

javascript - 模态隐藏故障排除

asp.net-mvc-3 - LINQ to Entities 仅支持转换 EDM 基元或枚举类型

javascript - node/express 强制浏览器使用自定义名称下载文件

java - 从FTP下载时如何检查文件是否存在

ssl - 通过 SSL 的 IE8 附件下载问题

javascript - 从 Ajax 的 PHP 脚本重定向

javascript - jQuery 根据当前颜色更改 div 的背景颜色

javascript - AJAX 仅更新最后一个项目 ID

javascript - 当选项卡在 mvc bootstrap tab-content 中处于事件状态时动态加载内容

validation - ASP.NET MVC - 使用 3 个下拉列表保留无效的日期时间选择