2013-09-24 3 views
2

아래 나열된 링크를 모두 따라갔습니다. 작성하는 가장 좋은 방법은이 SMALL 작성 및 다운로드 기능을 찾았습니다.파일 다운로드 방법

그것은 완벽하게 오류없이 코드를 통해 내가이 실행되지만 "쫓아"하지 않습니다 때마다 실행을 (Excel 용 EPPlus 사용) 다운로드 할 파일 (대화 상자 또는 w/e로 저장). I 누락/잘못하고 있어요 무엇

public ActionResult ShowReport() 
    { 
     using (var stream = new MemoryStream()) 
     { 

      ExcelPackage pck = new ExcelPackage(); 
      var ws = pck.Workbook.Worksheets.Add("Sample1"); 

      ws.Cells["A1"].Value = "Sample 1"; 
      ws.Cells["A1"].Style.Font.Bold = true; 
      var shape = ws.Drawings.AddShape("Shape1", eShapeStyle.Rect); 
      shape.SetPosition(50, 200); 
      shape.SetSize(200, 100); 
      shape.Text = "Sample 1 text text text"; 

      var fileDownloadName = "sample.xlsx"; 
      var contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";//System.Net.Mime.MediaTypeNames.Application.Octet 
      var fileStream = new MemoryStream(); 
      pck.SaveAs(fileStream); 
      fileStream.Position = 0; 

      var fsr = new FileStreamResult(fileStream, contentType); 
      fsr.FileDownloadName = fileDownloadName; 

      byte[] fileBytes = ReadToEnd(fileStream); 
      string fileName = "example"; 
      return File(fileBytes, contentType, fileName); 
     } 
    } 

? - 그 대화를 직접 써야하나요?

PN : 나는 또한

byte[] fileBytes = ReadToEnd(fileStream); 
string fileName = "example"; 
return File(fileBytes, contentType, fileName); 

는 당연히 내가 바이트 스트림으로 변환하는 방법을 알아낼했다이 방법을 시도하지만 그것도 아무 것도 보이지 않았다. 의

이미지 크롬의 (당신이 CTL + 마우스 휠의 스크롤 볼 수없는 경우) 작은 이미지에 대한 죄송 네트워크 개발 툴 enter image description here 당신의 지원 browswer의 경우.

+0

코드의 마지막 줄 ("아무것도 표시하지 않음")이 올바른 방법입니다. 어떻게 보이지 않았는지 자세히 설명해주십시오. 서버의 응답이 전혀 없었습니까? 이것을 디버깅 할 때 어디에서 실패할까요? – David

+0

글쎄, HTTP 헤더 및 기타 확장 기능과 몇 가지 다른 확장 기능을 사용하여 Chrome에서 내 browswer를 열고 개발자 도구를 열면 "Gone Wrong"의 흔적이 표시되지 않습니다.그 밖의 다른 방법은 무엇입니까? 예, VS 내부 코드를 밟지 않았습니까? –

+0

브라우저의 디버깅 도구에서 서버의 응답은 무엇입니까? 실제 파일이 나오고 비어 있거나 손상 되었습니까? 파일 서버 쪽을 저장하면 유효한 파일입니까? – David

답변

3

. (위의 코멘트 스레드에 대응)

게시 된 이미지에서 실제 파일 요청 (목록의 마지막 파일)이 일반적인 문서 수준 요청 대신 JavaScript 코드에서 오는 것처럼 보입니다. 주어진이 가능성이 높습니다 서버 쪽 코드가 제대로 작동하고 올바른 응답을 반환합니다.

그러나 AJAX 요청이므로 브라우저는 실제로 응답을 어떻게 처리해야하는지 알지 못합니다. 몇 가지 잠재적 인 솔루션이 있습니다 here. 이상적으로는 이것을 정상적인 요청으로 만들고 가능한 경우 그림에서 AJAX를 제거하고 싶을 것입니다. 이것이 옵션이 아닌 경우에도 JavaScript에서 문서 수준 요청을 시작할 수 있습니다. 이처럼 간단 뭔가 :

window.location = '@Url.Action("Method", "Controller")'; 

이것은 현재로 자바 스크립트 코드에서 시작된다, 그러나 전체가 아닌 브라우저의 AJAX 요청을 할 것이다. 그 트릭을해야합니다.

+0

감사합니다. 링크도 마찬가지입니다. –

-1

메모리 스트림을 사용하여, 당신은 할 수 있습니다 응답 개체로는 엑셀 패키지

을 저장 한 후 간단한 패스

코드 :

Response.AddHeader("content-disposition", "attachment;filename=FILENAME.xlsx") 
    Response.Charset = String.Empty 
    Response.ContentType = "application/ms-excel" 
    Response.BinaryWrite(stream.ToArray()) 
    Response.End() 
+1

컨트롤러 액션에서'ActionResult'를 반환하는 것은'Response' 객체에 직접 쓰는 것보다 * 선호됩니다. 사용자의 접근 방식은 컨트롤러를 HTTP 컨텍스트에 단단히 연결하여 이동성이 떨어지며 단위 테스트를 매우 어렵게 만듭니다. – David