2012-02-15 4 views
0

로컬 서버에서 파일을 다운로드하려고합니다. 파일을 다운로드하는 방법은 파일을 찾을 수없는 경우 오류 메시지를 표시합니다. JsonResult를 반환하는 메서드에서 파일을 다운로드 할 수 있습니까?

은 내보기에 코드입니다 :

function download(id) { 
      var response = null; 
      var fileId = id == null? 0 : id; 
      var args = {fileId : fileId }; 

       $.ajax({ 
        type: 'POST', 
        url: '/Home/DownloadFile', 
        data: args, 
        dataType: "json", 
        traditional: true, 
        success: function (data) { 
         $("#message").attr('style', 'margin-left:auto; margin-right:auto; font-        weight: bold; color: Red'); 
         $("#message").html(data.message); 
        } 
       }); 
      } 
     } 

<div id="message"></div> 
<a class="fileName" href="javascript:void(0)" onclick='download(@f.Id)'>@f.Name</a> 

그리고 이것은 내 컨트롤러 :

public JsonResult DownloadFile(int fileId) 
    { 
     FileService fileService = new FileService(); 
     DirectoryService directoryService = new DirectoryService(); 
     File file = fileService.GetByFileId(fileId); 

     bool noError = false; 
     string _message = String.Empty; 

     if (file == null) 
     { 
      _message = "File does not exist"; 
     } 
     else if (System.IO.File.Exists(file.FilePath)) 
     { 
      using (StreamReader reader = System.IO.File.OpenText(file.FilePath)) 
      { 
       Stream s = reader.BaseStream; 
       byte[] fileData = Utils.ReadStream(s); 
       string contentType = Utils.getContentType(file.FileName); 

       Response.Clear(); 
       Response.Buffer = true; 
       Response.AddHeader("Content-Disposition", "attachment;filename=" + file.FileName); 
       Response.ContentType = contentType; 
       Response.BinaryWrite(fileData); 

       noError = true; 
      } 
     } 
     else 
     { 
      _message = "File \"" + file.FileName + "\" could not be found."; //File "foo.txt" could not be found 
     } 

     if (noError) 
      _message = String.Empty; 

     var data = new { message = _message }; 
     return Json(data, JsonRequestBehavior.AllowGet); 
    } 

이상한 것은 내가이 시험을 처음으로, 그것 일 것입니다. 아무것도 바꾸지 않았지만 지금은 메서드가 정상적으로 실행되지만 파일은 다운로드되지 않습니다. 누군가 제발 도와 줄 수 있니?

+0

전달 된 ID가 맞습니까? 파일이 발견되었고 파일이 있습니까? – gideon

+0

예. 디버거로 모든 것을 검사하고 있습니다. 내 생각 엔 아약스가 내 파일을 다운로드하지 못하도록 막아두고있다. –

+0

이것은 사용해야하는 해결책이 아니지만 멈추고 다른 해결책이없는 경우 시도해 볼 수있다. 파일 다운로드 방법을 컨트롤러/동작으로 이동한다. (아내가 아님). 파일이 발견되면 파일 다운로드 작업으로 리디렉션을 보냅니다. 이 방법이 효과가 있을지 확실하지 않지만 이상적인 답변이 아니라고 확신합니다. – rkw

답변

0

아니요, 불가능합니다. AJAX로 파일을 다운로드 할 수 없습니다. 또한 두 가지를 반환하는 컨트롤러 작업 (파일 데이터와 JSON)을 사용할 수 없습니다. AJAX로 파일을 다운로드 할 수없는 이유는 요청이 서버로 전송 되어도 AJAX success 콜백 내부의 클라이언트가 매개 변수로 전달 된 원시 파일 데이터를 가져올 때까지 파일이 도착하기 때문입니다. 너는 그걸로 할 수있는 것이 많다. 파일을 클라이언트 컴퓨터에 저장할 수 없으며 사용자가 컴퓨터에 파일을 저장하려는 위치를 선택하라는 메시지를 표시 할 수 없습니다.

파일을 다운로드하려면 일반 HTML 링크 또는 양식을 사용하십시오. 아니 AJAX.

+0

감사합니다. 그것이 내가 생각했던 거죠. 내가하려는 일에 대해 어떤 제안이 있니? 기본적으로, 나는 단지 파일이 서버에서 발견되지 않았 음을 사용자에게 알려주고 싶다 / –

관련 문제