Как реализовать загрузку файлов с помощью AJAX и MVC
Я хотел бы предоставить операцию загрузки файлов с помощью вызова jQuery AJAX с некоторыми параметрами в MVC
Пример
(javascript)
function DoDownload(startDate) {
$.ajax({
url:"controller/GetFile/",
data: {startDate:startDate}
...
});
}
C# Controller Code
public void GetFile(string startDate) {
var results = doQuearyWith(startDate);
// Create file based on results
....
// HOw do I tell the server to make this a file download??
}
Обычно я просто хочу, чтобы мой файл загружал ссылку, например:
<a h r e f="mycontroller/getfile/1"/>Download</a>
но в случае выше дата будет динамической.
Если я не использую ajax, что было бы предпочтительным способом передать в params на MVC-контроллер с помощью javascript?
Пример:
window.location = "mycontroller/GetFile/" + $("#fromDate").val();
при условии, что дата 12-25-2012
это произведет
mycontroller/GetFile/12/25/2012
будет ли MVC рассматривать это как три параметра?
Ответы
Ответ 1
То, что я закончил, вызывает мой контроллер из моего javascript, например:
var url = "/mycontroller/GetFile?startDate=" + $("#mydate").val() + etc...
window.location = url;
mycontroller.cs
public void GetFile(DateTime startDate)
{
}
Моя первоначальная проблема заключалась в параметрах даты. Я не хотел его разбирать.
Ответ 2
Используя помощник ActionLink, вы можете передать несколько параметров вашему контроллеру:
HtmlHelper.ActionLink(
string linkText,
string actionName,
string controllerName,
object routeValues,
object htmlAttributes
)
Итак, в вашем случае:
@Html.ActionLink("Download file", "GetFile", "MyController", new { startDate = "##" }, new { id="mydownloadlink" })
Используя jQuery, вы можете изменить значение startDate
в ссылке с содержимым вашего выбора даты или текстового поля.
$("#mydownloadlink").attr("href").replace("##", $("#yourdatetexbox").val);
Затем в вашем контроллере просто используйте один из других ответов здесь, около FileResult
.
Надеюсь, это поможет вам...
Ответ 3
Вы можете использовать метод File
класса контроллера, чтобы вернуть файл обратно в браузер.
Ниже приведен пример файла pdf.
public ActionResult GetFile(int id)
{
var fileInfo=repositary.GetFileDedetails(id);
var byteArrayOFFile=fileInfo.FileContentAsByteArray();
return File(byteArrayOFFile,"application/pdf","yourFriendlyName.pdf");
}
Предполагая, что метод repositary.GetFileDedetails
возвращает данные файла из идентификатора.
Вы также можете вернуть файл из физического местоположения (пути) или потока. Проверьте все перегрузки метода File
и используйте соответствующий.
Это не имеет никакого отношения к ajax. это обычный GET
запрос через браузер.
Ответ 4
Ваш метод действия контроллера должен возвращать FileResult вместо void. И нет необходимости делать это через AJAX - на самом деле, вы не хотите делать это с AJAX. Вам понадобится браузер, поэтому он знает, как предоставить пользователю диалоговое окно загрузки.
Смотрите эти ссылки:
Обработка файла ASPR MVC FileResult, возвращаемого в вызове Ajax (jQuery)
Загрузка файла в Asp.Net MVC 2
Надеюсь, это поможет.