Сохранить файл с подсказкой "Сохранить как..." с помощью FileResult
Мне нужно скачать конкретные файлы при нажатии на текст. Я ожидаю, что в типичном диалоговом окне "Сохранить как..." будет выбрано место для сохранения файла, но он не отображается. Запрос и ответ в порядке.
Заголовок запроса / ответа
GET /Survey/GetSurveyFile? Survey=1085&surveyFileType=2 HTTP/1.1
Хост: localhost:50518
Подключение: keep-alive
Пользователь-агент: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/44.0.2403.107 Safari/537.36 OPR/31.0.1889.99
Принять: /
X-Requested-With: XMLHttpRequest
======================
HTTP / 1.1 200 ОК
Cache-Control: приватный
Тип контента: приложение / октет-поток
Сервер: Microsoft-IIS / 8.0
X-AspNetMvc-версия: 5.2
Содержание-Диспозиция: вложение; filename = "1052__1183__1291__Variable Header Definition.txt"
X-AspNet-версия: 4.0.30319
X-SourceFiles: =? UTF-8? B? UzpcVlNTb3VyY2VcUHJvamVrdGVcTU1JXGJmdWVudGVzXE1NSVxNaW5kc2hhUUUTU1JXE1NSVxTdXJ2Z0=VS = vlRVR3VR3VR3VRV
Постоянный-Auth: правда
X-Powered-By: ASP.NET
Дата: пн, 17 августа 2015 14:21:48 GMT
Длина контента: 333
Мой код:
Javascript
function getfile(filetype) {
var SurveyId = $('#SurveyID').val();
var url = '/Survey/GetSurveyFile';
$.ajax({
type: 'GET',
url: url,
data: { survey: SurveyId, surveyFileType: filetype },
success: function (result) {
// ?
},
error: function (result) {
// handle errors
location.href = "/Home/"
}
});
}
контроллер
public FileResult GetSurveyFile(string survey, string surveyFileType)
{
try
{
var tmpSurvey = EntityModelDataProvider.GetSurveyByID(int.Parse(survey));
var tmpSurveyFileTypes = EntityModelDataProvider.GetSurveyFileTypes();
var tmpSurveyFileType = tmpSurveyFileTypes.FirstOrDefault(_sft => _sft.SurveyFile_Type_Id == int.Parse(surveyFileType));
var tmpFile = EntityModelDataProvider.GetSurveyFilesBySurveyAndType(tmpSurvey.Survey_PK, tmpSurveyFileType.SurveyFile_Type_PK);
if (tmpFile != null)
{
byte[] fileBytes = tmpFile.SurveyFile;
string fileName = tmpFile.SurveyFile_Name;
return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
else
throw new Exception("File not found!");
}
catch (Exception ex)
{
throw ex;
}
}
Есть идеи, как я могу получить желаемое поведение?
1 ответ
ОРИГИНАЛ (читайте ОБНОВЛЕННУЮ часть после)
Посмотрите здесь скачать файл с помощью запроса AJAX
Я попробовал следующий код на моей машине
function getfile() {
$.ajax({
type: 'get',
url: '@Url.Action("Download")',
success: function () {
window.location = '@Url.Action("Download")';
}
});
}
$(function() {
$('h2').on('click', getfile);
});
public FileResult Download()
{
var bytes = System.IO.File.ReadAllBytes(Server.MapPath("~/123.txt"));
return File(bytes, System.Net.Mime.MediaTypeNames.Application.Octet, "123.txt");
}
ОБНОВЛЕНО (v2)
Вам не нужен запрос AJAX. Изменить window.location будет достаточно:
function getfile() {
var p1 = Math.random().toString();
var p2 = Math.floor(Math.random() * 100);
window.location = '@Url.Action("Download")?' + 'p1=' + p1 + '&' + 'p2=' + p2;
}
$(function() {
$('h2').on('click', getfile);
});
public FileResult Download(string p1, int p2)
{
var bytes = System.IO.File.ReadAllBytes(Server.MapPath("~/123.txt"));
return File(bytes, System.Net.Mime.MediaTypeNames.Application.Octet, string.Format("123_{0}_{1}.txt", p1, p2));
}