19

Below is my code :

ActionResult DownloadAttachment(student st) { var file = db.EmailAttachmentReceived.FirstOrDefault(x => x.LisaId == st.Lisaid); byte[] fileBytes = System.IO.File.ReadAllBytes(file.Filepath); return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, file.Filename); } 

This is the script which i'm using

$(function () { $("#DownloadAttachment").click(function () { $.ajax({ url: '@Url.Action("DownloadAttachment", "PostDetail")', contentType: 'application/json; charset=utf-8', datatype: 'json', type: "GET", success: function () { alert("sucess"); } }); }); }); 

How to return the file for download pursing above code?

6 Answers 6

20

I think there is no need of Ajax call you can do simply using hyperlink as below example.

View Code

<a href="@Url.Action("DownloadAttachment", "PostDetail", new { studentId = 123 })">Download Form</a> 

Controller Method

public ActionResult DownloadAttachment(int studentId) { // Find user by passed id var file = db.EmailAttachmentReceived.FirstOrDefault(x => x.LisaId == studentId); byte[] fileBytes = System.IO.File.ReadAllBytes(file.Filepath); return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, file.Filename); } 
Sign up to request clarification or add additional context in comments.

2 Comments

This example worked for me. This example sends an HttpGet request, and thus the data payload (just one record ID) in the request is included as parameters in the URL. But, what if I wanted to send an HttpPost request, with the data payload included as an object (containing many fields) in the request?
Also, would I be able to include an AntiForgeryToken in the HttpPost request?
10

Please, try this in ajax success

success: function () { window.location = '@Url.Action("DownloadAttachment", "PostDetail")'; } 

Updated answer:

public ActionResult DownloadAttachment(int studentId) { // Find user by passed id // Student student = db.Students.FirstOrDefault(s => s.Id == studentId); var file = db.EmailAttachmentReceived.FirstOrDefault(x => x.LisaId == studentId); byte[] fileBytes = System.IO.File.ReadAllBytes(file.Filepath); return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, file.Filename); } 

Ajax request:

$(function () { $("#DownloadAttachment").click(function () { $.ajax( { url: '@Url.Action("DownloadAttachment", "PostDetail")', contentType: 'application/json; charset=utf-8', datatype: 'json', data: { studentId: 123 }, type: "GET", success: function () { window.location = '@Url.Action("DownloadAttachment", "PostDetail", new { studentId = 123 })'; } }); }); }); 

10 Comments

basically if we don't give a ajax call still we can download file through window.location it's only because we need ajax request we are using the same in success function thanks for the help.!
There's no dual access to DownloadAttachment method?
This will call DownloadAttachment method 2 times. How to avoid that?
There is absolutely no need to use ajax for this at all. Just call window.location directly. All this is doing is making the same request twice. I have no idea why this was upvoted.
this has a redundant ajax call in it. You're passing the same data twice. The problem is ajax is by design prevented from downloading files.
|
2

The following code will help you to create the pdf/excel file in server and allow to download in browser through ajax call.

Controller for creating the pdf/excel file

public async Task<JsonResult> CardStatusReportExport(ReportFilterInputModel cardStatusReportInputModel, string type, string sortOrder) { cardStatusReportInputModel.ReportType = Reprot_Type_Const.CardStatus; cardStatusReportInputModel.ReportFormat = type; var CardStatusReport = await _reportDocGeneration.DocGeneartion(cardStatusReportInputModel); string result = Path.GetTempPath(); string fileName = "CardStatusReport" + DateTime.Now.ToString("yyyyMMddHHmmssfff"); if (type.Equals(Constants.FILE_TYPE_PDF)) { fileName = fileName + Constants.FILE_EXTENSION_PDF; System.IO.File.WriteAllBytes(result + fileName, CardStatusReport); } else { fileName = fileName + Constants.FILE_EXTENSION_EXCEL; System.IO.File.WriteAllBytes(result + fileName, CardStatusReport); } return Json(new { fileName = fileName}); } 

The following controller code will allow to download the created file from a single ajax call

[HttpGet] public async Task<ActionResult> Download(string file) { var path = Path.Combine(Path.GetTempPath(),file); var memory = new MemoryStream(); try { using (var stream = new FileStream(path, FileMode.Open)) { await stream.CopyToAsync(memory); } } catch (Exception e) { ModelState.AddModelError("FileNotFoundError", e.Message); return Content(e.Message); } memory.Position = 0; return File(memory, GetContentType(path), Path.GetFileName(path)); } private string GetContentType(string path) { var types = MediaType.GetMimeTypes(); var ext = Path.GetExtension(path).ToLowerInvariant(); return types[ext]; } 

Use the below ajax call for creation of pdf/excel file and download the same.

$.ajax({ method: 'POST', data: { type: val, cardStatusReportInputModel: payload, sortOrder : sortOrder}, url: '@Url.Action("CardStatusReportExport", "Reports")' }).done(function (data, statusText, xhdr) { try { if (data.fileName != "") { window.location.href = "@Url.RouteUrl(new { Controller = "Reports", Action = "Download"})/?file=" + data.fileName; ShowMessageAlert('@Html.Raw(Localizer["Report has been exported successfully"].Value.ToString())'); } $("#divLoader").hide(); } catch (e) { $("#divLoader").hide(); } }).fail(function (xhdr, statusText, errorText) { alert('error'); $("#divLoader").hide(); }); 

Comments

0
public FileResult DownloadGeneralDocs(string docName) { string fileName = docName+".pdf"; var path = _globalWebSettings.Value.DownloadGeneralDocsPath; string filePath = ""; if (fileName!="") { filePath = (_env.WebRootPath + string.Format("{0}{1}",path, fileName)); } FileInfo file1 = new FileInfo(filePath); byte[] fileBytes = System.IO.File.ReadAllBytes(file1.FullName); return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); } view.cshtml: <script> $(document).ready(function () { $("#docTable tbody tr td button").click(function (e) { var docName = $(this).closest("tr").find(".document_td_data").text(); $.ajax({ url: '@Url.Action("DownloadGeneralDocs", "Documents")', dataType: "html", cache:false, data: { 'docName': docName }, success: function (data) { window.location.href = "@Url.RouteUrl(new { Controller = "Documents", Action = "DownloadGeneralDocs" })/?docName=" + docName ; }, error: function (err, response) { console.log(err, response); alert(err, response.responseText); } }) }); }); 

1 Comment

A big block of code thrown up on the web without explanation doesn't help anyone. You should explain your approach and why your answer is better or different from the other answers.
0

Actually, there is no need to make double calls to API. It is possible to download a file by using the following code via JavaScript:

window.location.href = '@Url.Action("DownloadAttachment", "PostDetail", new { studentId = 123 })'; 

OR if your code is not placed in .cshtml file:

window.location.href = '/PostDetail/DownloadAttachment?studentId=123'; 

Comments

-1

Below method would helps calling action from Ajax request from jQuery dialog window and it executes the action and can be closed dialog window as soon the action return success result

Controller

 [HttpGet] public ActionResult DownloadCampaign(string filePath, string mode) { string contentType = string.Empty; var sDocument = filePath; if (!System.IO.File.Exists(sDocument)) { return HttpNotFound(); } if (mode == "action") return Json(new {fileName = filePath}, JsonRequestBehavior.AllowGet); if (sDocument.Contains(".pdf")) { contentType = "application/pdf"; } else if (sDocument.Contains(".docx")) { contentType = "application/docx"; } else if (sDocument.Contains(".xls")) { contentType = "application/xlsx"; } return File(sDocument, contentType, sDocument); } 

JQuery - Ajax Request

$(document) .ready(function() { $("#btnDownload").click(function () { var file = $("#FilePath").val(); $.ajax({ url: '@Url.Action("DownloadCampaign", "FileList")', data: { filePath: file, mode:'action' }, method: 'GET', dataType: 'json', //contentType: 'application/json; charset=utf-8', success: function(data) { @*window.location = '@Url.RouteUrl("DownloadCampaign", "FileList", new { filePath = data1.fileName })';*@ window.location.href = "@Url.RouteUrl(new { Controller = "FileList", Action = "DownloadCampaign" })/?filePath=" + data.fileName + "&mode=download"; $("#downloadFile_dialog").dialog("close"); }, error: function (req, status, errorObj) { alert("Error"); } }); }); }); 

Please reach out to me if you need more information about this.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.