2017-01-27 51 views
0

我想用ajax和ActionResult在浏览器上下载文件。该文件被下载并从我的ActionResult返回。从ajax和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; } 
}); 

感谢所有

回答

0

我改变了主意。我只是发送我的pdf(从我的控制器)在64基地,并在阿贾克斯:

success: function (data) { 
    window.open("data:application/pdf;base64," + data.data, '_blank'); 
} 
2

AJAX只是一个瘦客户机。默认情况下返回的响应没有任何反应。您有责任使下载发生。但是,这需要HTML5中的File 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({ 
    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看到它的工作。

+0

谢谢,我会明天测试这moring。 – Gobelet

+0

这不起作用,我有这个错误:“无法构造'Blob':第一个参数既不是数组,也没有索引属性” – Gobelet

+0

请参阅上面的编辑。 –