2015-08-17 2 views
0

Мне нужно загрузить определенные файлы при нажатии на какой-либо текст. Я ожидаю, что типичный диалог «Сохранить как ...», чтобы выбрать, где я должен был сохранить файл, но он не отображается. Запрос и ответ в порядке.Сохранить файл с запросом «Сохранить как ...» с помощью FileResult

заголовок запроса/ответа

GET/Голосование/GetSurveyFile опрос = 1085 & surveyFileType = 2 HTTP/1.1

Хост: локальный: 50518

соединения: держать-жив

User-Agent: 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

Accept: /

X-Requested-With: XMLHttpRequest

================ ======

HTTP/1.1 200 OK

Cache-Control: частный

Content-Type: применение/октет-поток

Сервер: Microsoft-IIS/8.0

X-AspNetMvc-Версия: 5.2

Content-Disposition: вложение; имя файла = "1052__1183__1291__Variable Заголовок Definition.txt"

X-Сеть САШ-версия: 4.0.30319

X-исходников,??? = UTF-8 B UzpcVlNTb3VyY2VcUHJvamVrdGVcTU1JXGJmdWVudGVzXE1NSVxNaW5kc2hhcmUuTU1JXE1NSVxTdXJ2ZXlcR2V0U3VydmV5RmlsZQ == =

Persistent-Auth : истинная

X-Powered-By: ASP.NET

Дата: Пн, 17 августа 2015 14:21:48 GMT

Content-Length: 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; 
    } 
} 

Любая идея, как я мог получить желаемое поведение?

+0

Что делать, если вы сделаете @ Html.ActionLink ("Сохранить как ...", "GetSurveyFile", "Обзор")? Я просто не понимаю, зачем вам нужен javascript. – kipwoker

+0

Я не хотел создавать ссылку. Вот почему я написал «щелчок на каком-то тексте». – blfuentes

ответ

1

ORIGINAL (читай ОБНОВЛЕНО часть после)

посмотреть здесь download file using an ajax request

Я попытался следующий код на моей машине

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)); 
} 
+0

Действительно ли мне нужно дважды вызвать метод? – blfuentes

+0

На самом деле это не так. Вы можете просто написать: 'function getfile() {window.location = '@ Url.Action (« Загрузить »)'; } ' – kipwoker

+0

Мне нужно использовать параметры в вызове Action. Если я просто использую это, веб-страница перенаправляется на пустой, но действие никогда не вызывается. 'var url = '@ Url.Action (« GetSurveyFile »,« Survey »)? onSurvey = _SurveyId_ & onDoc = _filetype _'. replace ('_ SurveyId_', SurveyId) .replace ('_ filetype_', filetype); window.location = url; ' – blfuentes