2015-08-17 67 views
0

我需要在單擊某些文本時下載特定文件。我希望典型的「另存爲...」對話框可以選擇我要保存文件的位置,但它不會出現。請求和響應是確定的。使用FileResult保存具有提示「另存爲...」的文件

請求/響應報頭

GET /測量/ GetSurveyFile調查= 1085 & surveyFileType = 2 HTTP/1.1

主機:?本地主機:50518

連接:保活用戶代理: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-要求 - 由於:XMLHttpRequest的

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

HTTP/1.1 200 OK

緩存控制:私人

內容類型:應用/八位字節流

服務器:IIS/8.0

X-AspNetMvc-版本:5.2

內容處置:附件;文件名= 「1052__1183__1291__Variable部首Definition.txt」

X-ASPNET-版本:4.0.30319

X-SourceFiles:????= UTF-8乙UzpcVlNTb3VyY2VcUHJvamVrdGVcTU1JXGJmdWVudGVzXE1NSVxNaW5kc2hhcmUuTU1JXE1NSVxTdXJ2ZXlcR2V0U3VydmV5RmlsZQ == =

持久-AUTH :真

X-已啓動方式:ASP.NET

日期:星期一,2015年8月17日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(「Save as ...」,「GetSurveyFile」,「Survey」),該怎麼辦?我只是不明白你爲什麼需要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(「Download」)'; }' – kipwoker

+0

我需要在Action調用中使用參數。如果我只是使用這個網頁重定向到一個空的,但行動永遠不會被調用。 'var url ='@ Url.Action(「GetSurveyFile」,「Survey」)?onSurvey = _SurveyId_&onDoc = _filetype _'。replace('_ SurveyId_',SurveyId).replace('_ filetype_',filetype); window.location = url;' – blfuentes

相關問題