My problem is that I send to client first PDF to download, then I need to check, if some data exists in my database, then depending on that check I need to show question tha
In success function of my ajax request FireBug show me that data2 is binary data of my PDF file, what I need to do to allow client to download this PDF file?
You should not use AJAX to download files. The problem is that you are fetching the pdf bytes in a javascript variable in the success callback of your AJAX call but there's nothing you could do with it. You cannot prompt the user to save it and of course you cannot save it to the client since javascript doesn't have the necessary privileges.
So you should use a normal request:
var downloadUrl = '<%= Url.Action("PrintDWList", "Reports")%>?' + $.param({ ids: data }, true);
window.location.href = downloadUrl;
Notice that this will send a GET request to the PrintDWList
action passing the ids query string parameter so make sure this action is accessible on GET. Now if the controller action uses the Content-Disposition header to attachment it will offer the user to download the file:
public ActionResult PrintDWList(int[] ids)
{
byte[] pdf = ...
return File(pdf, "application/pdf", "file.pdf");
}
@Darin is a great help always on this forum. His response saved my day too. Just extending his answer to include the formats and stuff that I did. This is in response to his " Now if the controller action uses the Content-Disposition header to attachment it will offer the user to download the file:"
case "PDF":
HttpContext.Current.Response.AddHeader("Content-Type", "application/pdf");
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + reportName + ".pdf");
break;
case "XML": HttpContext.Current.Response.AddHeader("Content-Type", "application/xml");
break;
case "MHTML": HttpContext.Current.Response.AddHeader("Content-Type", "message/rfc822");
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + reportName + ".mhtml");
break;
case "EXCEL": HttpContext.Current.Response.AddHeader("Content-Type", "application/vnd.ms-excel");
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + reportName + ".xls");
break;
case "WORD": HttpContext.Current.Response.AddHeader("Content-Type", "application/msword");
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + reportName + ".doc");
break;
case "CSV":
HttpContext.Current.Response.AddHeader("Content-Type", "text/csv");
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + reportName + ".csv");
break;
case "HTML4.0": HttpContext.Current.Response.AddHeader("Content-Type", "message/rfc822"); ;
break;